3 3 31 2 31 2 31 2 331410Sample OutputCase 1:NOYESNO这道题就是首先想到会将他们三个数表的所有情况列出来,放进一个数组里,但是这样去做的时候,就会超出限制,也就是会出现memory limited exceed,再去看题目的要求,发现这里的每一个数表的大小是500,三个数表的大小相乘。就会超过10000kb的限制,但是如果是两个数表的大小乘起来的话,就不会超过限制,所以可以想到,先将两个数表的和算出来,然后再根据答案,在剩下的一个数表中用二分法找答案,由于二分法是需要数表有序的,就可以用头文件algorithm中的sort,当然这就是具体的解体细节了,然后将思路实现这样就可以ac了#include<iostream>#include<algorithm>using namespace std;int find_need(int a[],int s,int need){ int low = 0; int high = s-1; while(low<high) { int mid = (low+high)/2; if(a[low]==need||a[high]==need||a[mid]==need) return true; else if(a[mid]>need) high = mid-1; else low = mid+1; } return false;}int main(){ int times = 0; int anum,bnum,cnum; while(cin>>anum>>bnum>>cnum) { times++; cout<<"Case "<<times<<":"<<endl; int ava[anum],bva[bnum],cva[cnum]; for(int i = 0;i<anum;i++) cin>>ava[i]; for(int i = 0;i<bnum;i++) cin>>bva[i]; for(int i = 0;i<cnum;i++) cin>>cva[i]; int sum[bnum*cnum]; int help = 0; for(int i = 0;i<bnum;i++) { for(int j = 0;j<cnum;j++) { sum[help] = bva[i]+cva[j]; help++; } } sort(sum,sum+bnum*cnum); int xnum; cin>>xnum; int yes[xnum]; int xva[xnum]; for(int i = 0;i<xnum;i++) { yes[i] = 0; cin>>xva[i]; for(int j = 0;j<anum;j++) { if(find_need(sum,bnum*cnum,xva[i]-ava[j])) { yes[i] = 1; break; } } if(yes[i]==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }}
新闻热点
疑难解答