3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Case 1: NO YES NO
三层for时间复杂度较高,我们可以对其优化,我们两层for遍历A,B集合中元素,加和后放在一个数组det【】中。然后我们使用二分查找的方法,对w-c【i】进行查找,如果找到了w-c【i】,那么就输出YES,否则输出NO。
思考过程是在不断TLE中形成的T___T
AC代码:
#include<stdio.h> #include<string.h> #include<climits> #include<algorithm> using namespace std; #define ll long long int ll det[505*505]; ll a[505]; ll b[505]; ll c[505]; int cont; int erfen(ll x) { int l=0;int r=cont-1; while(r-l>=0) { int mid=(l+r)/2; //printf("%d %d %d\n",l,r,mid); if(det[mid]>x) { //printf("yes\n"); r=mid-1; } else if(det[mid]<x) { //printf("yes2\n"); l=mid+1; } else return 1; } return 0; } int main() { int n1,n2,n3; int kase=0; while(~scanf("%d%d%d",&n1,&n2,&n3)) { memset(det,0,sizeof(det)); cont=0; for(int i=0;i<n1;i++)scanf("%I64d",&a[i]); for(int i=0;i<n2;i++)scanf("%I64d",&b[i]); for(int i=0;i<n3;i++)scanf("%I64d",&c[i]); for(int i=0;i<n1;i++) { for(int j=0;j<n2;j++) { det[cont++]=a[i]+b[j]; } } sort(c,c+n3); sort(det,det+cont); int q; scanf("%d",&q); printf("Case %d:\n",++kase); while(q--) { ll w; scanf("%I64d",&w); int ok=0; for(int i=0;i<n3;i++) { if(erfen((ll)w-c[i])==1) { ok=1; printf("YES\n"); break; } } if(ok==0)printf("NO\n"); } } }