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; } }}
新聞熱點
疑難解答