HDU 2141:Can you find it?(二分)
在三个数组中各选一个数,判断相加是否能得到目标数。一开始想暴力发现impossible~
联系到二分,经过学长指点才将前两个数组合并,将前两个数组所有可能的和保存在新数组中,再根据第三个数组,二分查找新数组以判断是否有所需的数
#include"cstdio" #include"cstring" #include"algorithm" #define MAXN 505 using namespace std; int sum[MAXN*MAXN]; int tail=0,p=1; bool judge(int b,int target) { int low=0,high=tail-1; while(low<=high) { int mid=(low+high)/2; if(sum[mid]+b==target) return true; else if(sum[mid]+b<target) low=mid+1; else high=mid-1; } return false; } int main() { int len1,len2,len3; while(scanf("%d%d%d",&len1,&len2,&len3)!=EOF) { int num1[MAXN],num2[MAXN],num3[MAXN]; for(int i=0;i<len1;i++) scanf("%d",&num1[i]); for(int i=0;i<len2;i++) scanf("%d",&num2[i]); for(int i=0;i<len3;i++) scanf("%d",&num3[i]); sort(num3,num3+len3); tail=0; memset(sum,0,sizeof(sum)); for(int i=0;i<len1;i++) for(int j=0;j<len2;j++) sum[tail++]=num1[i]+num2[j]; sort(sum,sum+tail); int n; scanf("%d",&n); printf("Case %d:\n",p++); while(n--) { int temp,i=0,ok=0; scanf("%d",&temp); while(!ok&&i<len3) if(judge(num3[i++],temp)) ok=1; if(ok) printf("YES\n"); else printf("NO\n"); } } return 0; }