五行數,分別為a1,a2,a3,a4,a5,先將a1與a2相加和成新的一行s1,將a3與a4相加和成新的一行s2,對s1,s2,從達到小排序,時間復雜都一共為n^2+n^2+nlogn+nlogn
設x為s1的頭,y為s2的尾,然後對每一個a5進行比較,如果(s1[x]+s2[y]+a5[i]<0) x++; else if((a[x]+b[y]+c[i])>0) y--; 時間復雜都為n^3,其實這樣做快是因為排序後避免的很多沒有必要的比較
[cpp]
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 205
__int64 a[N*N],b[N*N],c[N];
int main(){
__int64 t,n,x,y;
scanf("%I64d",&t);
while(t--){
int cou=0;
scanf("%I64d",&n);
for(int i=0;i<n;i++)
scanf("%I64d",&c[i]);
for(int i=0;i<n;i++){
scanf("%I64d",&x);
for(int j=0;j<n;j++){
a[cou++]=x+c[j];
}
}
cou=0;
for(int i=0;i<n;i++)
scanf("%I64d",&c[i]);
for(int i=0;i<n;i++){
scanf("%I64d",&x);
for(int j=0;j<n;j++){
b[cou++]=x+c[j];
}
}
for(int i=0;i<n;i++)
scanf("%I64d",&c[i]);
sort(a,a+cou);
sort(b,b+cou);
// cout<<"***"<<endl;
int flag=0;
for(int i=0;i<n;i++){
x=0;y=cou-1;
while(x<cou&&y>=0){
if(a[x]+b[y]+c[i]<0) x++;
else if((a[x]+b[y]+c[i])>0) y--;
else {
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
}
作者:youngyangyang04