JZOJ 3508. 【NOIP2013模拟11.5B组】好元素

目录:


题目:

单击查看题目


分析:

10% n 4 随便做。
40% n 3 用布尔数组保存存在的元素,用三层枚举 a [ i ] , a [ j ] , a [ k ] ,如果 a [ i ] + a [ j ] + a [ k ] 存在,那么答案加1。注意枚举顺序和判重。
70% n 2 预处理两个数的和,再枚举,因为每一个元素值比较小,开一个数组来存储是否存在。(其实 n 3 的方法加上剪枝也可以过)
100% n 2 因为元素的值比较大,在70%的思想上用哈希进行判断即可。


代码:

#pragma GCC optimize("3")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#define mod 25000003
#define LL long long
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
int p[25000004];
int x[5001],ans;
int locate(int x)
{
    int wz=(x%mod+mod)%mod;
    while(p[wz]!=99999999&&p[wz]!=x) wz++,wz%=mod;
    return wz;
}
void in(int x)
{
    p[locate(x)]=x;
    return;
}
int main()
{
//  freopen("good.in","r",stdin);
//  freopen("good.out","w",stdout);
    int n=read();
    for(int i=0;i<=25000003;i++) p[i]=99999999;
    for(int i=1;i<=n;i++)
    {
        x[i]=read();
        for(int j=1;j<i;j++)
          if(p[locate(x[i]-x[j])]==x[i]-x[j]) {ans++;break;}
        for(int j=1;j<=i;j++)
          if(p[locate(x[j]+x[i])]!=x[j]+x[i]) in(x[j]+x[i]);
    }
    printf("%d",ans); 
    fclose(stdin);
    fclose(stdout); 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35786326/article/details/81106022