hdu2141 can you find it?分治第一場基礎演算法
阿新 • • 發佈:2019-01-06
//o(n^3)複雜度,肯定炸掉啦,所以想個簡單法 //把前倆數組合並,反正就是合併倆,至於哪倆先不管 //然後用一個新陣列存一下和,快排排序一下, //因為新數組裡面元素最多,就把他用來二分 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int ll[1003],mm[1003],nn[1003],sum[250003]; bool bsearch(int a,int l,int r){ if(l>r) return false; int mid=(l+r)/2; if(sum[mid]==a) return true; else { if(sum[mid]<a) bsearch(a,mid+1,r); else bsearch(a,l,mid-1); } } int main() { int l,n,m,x,ss,coun=1;//lnm為題目中給的lnm while(~scanf("%d%d%d",&l,&n,&m)){ for(int i=0;i<l;i++){ scanf("%d",&ll[i]); } for(int j=0;j<n;j++){ scanf("%d",&nn[j]); } for(int k=0;k<m;k++){ scanf("%d",&mm[k]); } scanf("%d",&x); int p=0,q=0; for(int i=0;i<l;i++){ for(int j=0;j<n;j++){ sum[p++]=ll[i]+nn[j];//當初頭腦發熱,誤把j寫成n就是沒發現 } } sort(sum,sum+p); printf("Case %d:\n",coun++); for(int i=0;i<x;i++){ int flag=0; scanf("%d",&ss); for(int i=0;i<m;i++){ if(bsearch(ss-mm[i],0,p-1)) { flag=1; break;//注意這裡要停下 } } if(flag){ printf("YES\n"); } else { printf("NO\n"); } } } return 0; }