HDU 5522 Numbers

来源:互联网 发布:windows 调试模式 编辑:程序博客网 时间:2024/06/05 08:32

找到一组A-C=B即 找到一组A+B=C 由于n只有100可以n³的暴力枚举 看是否存在a[i]+a[j]=a[k]

而n²的做法是 用visit数组标记每个数出现过几次 这样枚举出A+B后看C是否出现过即可 注意特殊判断0的情况 因为A为0(A<B)时 A+B会被B标记到 所以要visit大于1才行

nlogn的做法是,可以先将0取出特殊判断,用FFT求出所有A+B的结果,然后再判断。

n³的做法:

#include<iostream>#include<cstdio>#include<cstring>#include<cctype>#include<cmath>#include<vector>#include<queue>#include<map>#include<algorithm>#include<set>#define scnaf scanf#define cahr char#define bug puts("bugbugbug");using namespace std;typedef long long ll;const int mod=1000000007;const int maxn=1000+5;const int inf=1e9;const int maxe=200000;int a[maxn],visit[maxn];int main(){    int n;    while(~scanf("%d",&n))    {        memset(visit,0,sizeof(visit));        for(int i=0;i<n;i++){            scanf("%d",&a[i]);            visit[a[i]]++;        }        sort(a,a+n);        int flag=0;        for(int i=0;i<n;i++)            for(int j=i+1;j<n;j++)                for(int k=j+1;k<n;k++)            {                if(a[i]+a[j]==a[k]) {                    flag=1;                    break;                }            }        if(flag) puts("YES");        else puts("NO");    }    return 0;}

n²的做法:

#include<iostream>#include<cstdio>#include<cstring>#include<cctype>#include<cmath>#include<vector>#include<queue>#include<map>#include<algorithm>#include<set>#define scnaf scanf#define cahr char#define bug puts("bugbugbug");using namespace std;typedef long long ll;const int mod=1000000007;const int maxn=2000+5;const int inf=1e9;const int maxe=200000;int a[maxn],visit[maxn];int main(){    int n;    while(~scanf("%d",&n))    {        memset(visit,0,sizeof(visit));        for(int i=0;i<n;i++){            scanf("%d",&a[i]);            visit[a[i]]++;        }        sort(a,a+n);        int flag=0;        if(visit[0]--){           for(int i=0;i<=1000;i++)           if(visit[i]>=2) {                flag=1;                break;           }        }        for(int i=0;i<n;i++)            if(a[i]&&!flag)            for(int j=i+1;j<n;j++)                if(visit[a[i]+a[j]]) {flag=1;break;}        if(flag) puts("YES");        else puts("NO");    }    return 0;}



 


0 0
原创粉丝点击