这题我是把5个集合第一个和第二个,第三个和第四个分别相加。得到新的两个集合s1,s2。再用枚举的方法把第五个集合的元素都与s1和s2的各个元素相加。如果得到和为零就返回true,没有就返回false。
最郁闷的是我用long long定义数组,输入用%lld是WA,用%I64d是AC。。。
using namespace std;
int n,g;
long long s1[40010],s2[40010];//注意用long long定义,数组范围要开大
long long a[6][205];
int f()
{
int i,h,l;
long long k;
for(i=0;i<n;++i)
{
k=-a[4][i];
h=g-1;
l=0;
while(h>=0&&l<g)
{
if(s1[l]+s2[h]==k)//判断是否出现满足条件
{
return 1;
}
else if(s1[l]+s2[h]<k)
{
l++;
}
else
{
h--;
}
}
}
return 0;
}
int main()
{
int N,i,j;
scanf("%d",&N);
while(N--)
{
scanf("%d",&n);
for(i=0;i<5;++i)
{
for(j=0;j<n;++j)
{
scanf("%I64d",&a[i][j]);//注意输入
}
}
g=0;
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
s1[g++]=a[0][i]+a[1][j];//俩集合合并成一个
}
}
g=0;
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
s2[g++]=a[2][i]+a[3][j];
}
}
sort(s1,s1+g);//排序为后面的枚举做准备
sort(s2,s2+g);
if(f()==1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}