题目详见链接http://acm.hdu.edu.cn/showproblem.php?pid=2141
这个题,直接O(n^3)(三个for循环)肯定超时
仔细一想发现可以把时间降到O(n^2*logn)
具体思路
利用A+B=X-C A+B的所有情况先存在sum数组里 然后使用二分每次查找x-c是否在sum中出现就OK
#include<cstdio>
#include<algorithm>//1
#define maxn 510
using namespace std;//2 使用sort 1 2两个头文件不可少
int a[maxn],b[maxn],c[maxn],sum[maxn*maxn];
int left,right,mid,k;
int erfenfa(int y)
{
left=1,right=k;
while(left<=right)
{
mid=(left+right)>>1;//注意:写在while循环里 写在外面 就是死循环 超时
if(sum[mid]>y)
right=mid-1;
else if(sum[mid]<y)
left=mid+1;
else return 1;
}
return 0;//查找遍了 还没找到要找的数 返回0
}
int main()
{
int l,n,m,i,j;
int cnt=1;//*写在外面
while(~scanf("%d%d%d",&l,&n,&m))
{
for(i=0;i<l;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
for(i=0;i<m;i++)
scanf("%d",&c[i]);
k=0;
for(i=0;i<l;i++)
{
for(j=0;j<n;j++)
{
sum[k]=a[i]+b[j];
k++;
}
}
sort(sum,sum+k);
int s,x;
scanf("%d",&s);
printf("Case %d:\n",cnt++);//*int cnt=0,++cnt;int cnt=1,cnt++;
while(s--)
{
int flag=0;
scanf("%d",&x);
for(i=0;i<m;i++)
{
flag=erfenfa(x-c[i]);
if(flag)
break;//*跳出循环
}
if(flag)
printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
/*
做这道题时真是哑巴吃黄连有苦说不出啊 code中 //*部分就是我被坑的部分
代码注释中第一个*处
1.int cnt=0;
printf("Case %d:\n",cnt++);
2.int cnt=1;
printf("Case %d:\n",++cnt);
使用dev-c++做题时上面两种情况在编译输出时都没有错误(case 1,case 2......)
但提交时oj系统显示wa
只有下面两种情况才是正确的
3. int cnt=0;
printf("Case %d:\n",++cnt);
4.int cnt=1;
printf("Case %d:\n",cnt++);
第二个*处
if(flag)
break; 不写的话不影响编译运行 但提交wa
*/