著名物理学家 Daffy Duck 提出了核反应控制的关键理论。
该理论的(玄学)表述是:在一个原子堆中有很多原子量不同的原子,如果原子 A 的原子量和原子 B 的原子量之和,恰好等于原子 C 的原子量,那么核反应控制难度将急剧增大。
该理论的(数学)表述是:有集合
A={a1,a2,…,an}
,如果存在
i,j,k(i≠j,i≠k,j≠k)
使得
ai+aj=ak
,则输出 NO
;否则输出 YES
。
Input
第一行是数据组数 T (1≤T≤20) 。接下来 2T 行:
每两行一组数据,第一行是一个整数
n
(1≤n≤50 000)
,第二行是用空格隔开的
n
个不同的整数
a1,a2,…,an
(1≤a1,a2,…,an≤200 000)
。
Output
对于每组数据,输出 Case x: y
。其中 x 是从 1 开始的测试数据编号,y 是 YES
或 NO
。
枚举i j 计算 ak 用map查看ak是否在集合A中。时间复杂度O(N^2)。map可用数组代替,查找速度更快,枚举i j 有trick ,先对ai数组排序,
如果ai + aj 都大于200000了,那么后面的数相加的和只会越来越大,所以直接break掉。然后就过了QAQ 。。。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6;
const ll mod=1e9+7;
int a[50005];
//struct node{
// int val;
// set<int> s;
// bool operator<(const node t){
// return val<t.val;
// }
// bool operator==(const node t){
// return val==t.val;
// }
//};
int mp[200005];
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++){
int n;
scanf("%d",&n);
memset(mp,0,sizeof(mp));
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
mp[a[i]]=1;
}
sort(a,a+n);
int flag=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
int x=a[i]+a[j];
if(x<1||x>200000)break;
if(mp[x]==1){
flag=1;
break;
}
}
if(flag)break;
}
if(flag)printf("Case %d: NO\n",cas);
else printf("Case %d: YES\n",cas);
}
return 0;
}