O(n^3^)暴力枚举,数据量是1.25e8(1.25*10^8^)。
钝角用两边的向量小于0判断,比较坑的地方是有可能选的三个点共线,无法组成三角形。注意要先特判是否能组成三角形。(钝角三角形首先得是三角形啊!不要只判断是否有钝角了!因为这玩意我给wa了几发)

#include <bits/stdc++.h>
using namespace std;
int n,ans;
struct node
{
    int x,y;
}p[510];
double f(node s1,node s2)//求两点距离
{return sqrt(1.0*(s1.x-s2.x)*(s1.x-s2.x)+1.0*(s1.y-s2.y)*(s1.y-s2.y));}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>p[i].x>>p[i].y;
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            for(int k=j+1;k<=n;k++)
            {
                double d1=f(p[i],p[j]);
                double d2=f(p[i],p[k]);
                double d3=f(p[j],p[k]);
                if(d1+d2<=d3||d1+d3<=d2||d2+d3<=d1)continue;//不能组成三角形
                int a1=p[i].x,b1=p[i].y;
                int a2=p[j].x,b2=p[j].y;
                int a3=p[k].x,b3=p[k].y;
                int s1=(a2-a1)*(a3-a1)+(b2-b1)*(b3-b1);
                int s2=(a1-a2)*(a3-a2)+(b1-b2)*(b3-b2);
                int s3=(a1-a3)*(a2-a3)+(b1-b3)*(b2-b3);
                if(s1<0||s2<0||s3<0)ans++;//存在钝角,更新答案
            }
    printf("%d\n",ans);
    return 0;
}

G题 判正误

等式右边的g最大只有1e9,所以等式左边的三个数相加不能超过1e9,那么可以把等式两边同时取模,模数取一个大于1e9的数,比如1e9+7,然后直接快速幂取模验证是否相等。(据说出题人卡了一些模数...)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll t,a[5],b[5];
ll qpow(ll a,ll b)
{
    ll s=1;
    while(b)
    {
        if(b&1)s=s*a%mod;
        a=a*a%mod;
        b=b/2;
    }
    return s;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        for(int i=1;i<=3;i++)
            cin>>a[i];
        for(int i=1;i<=4;i++)
            cin>>b[i];
        ll sum=0;
        for(int i=1;i<=3;i++)
            sum+=qpow(a[i],b[i]);
        if(sum==b[4])printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

B题 排数字

至少两个6,一个1,如果还有6和1,则每一对16接着第一个6组成无限循环,6 161616...(16无限循环)。

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,ans;
char s[N];
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>s;
    int num1=0,num6=0;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='1')num1++;
        else if(s[i]=='6')num6++;
    }
    if(num1<1||num6<2)ans=0;
    else
    {
        num1--;
        num6-=2;
        ans++;
        ans+=min(num1,num6);
    }
    printf("%d\n",ans);
    return 0;
}

A题 做游戏

签到题。答案要开long long(忘记开long long,wa了几发真是不应该)

#include <bits/stdc++.h>
using namespace std;
int a[5],b[5];
int main()
{
    ios::sync_with_stdio(false);
    cin>>a[2]>>a[3]>>a[1];
    cin>>b[1]>>b[2]>>b[3];
    long long ans=0;//ans要开long long
    for(int i=1;i<=3;i++)
        ans+=min(a[i],b[i]);
    printf("%lld\n",ans);
    return 0;
}