您的位置:首页 > 其它

hdu 2141 枚举后 二分查找

2016-05-19 18:08 197 查看
点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=2141

#include <stdio.h>
#include <algorithm>
using namespace std;
const int M=1010;
__int64 S[M*M],A[M],B[M],C[M],x,flag,k,t;

int BS(__int64 key)
{
__int64 l=1,r=k,mid;
while(l<=r) //
{
mid=(l+r)/2;

if(S[mid]<key)
{
l=mid+1;
}
else if(S[mid]>key)
{
r=mid-1;
}
else
return 1;

}
return 0;
}
int main()  //   判断是否存在 Ai+Bj+Ck=x   Ai Bj Ck  转化为  Ai+Bj=x-ck
{													// 枚举 A,B的和 sum
int l,n,m,s,i,j,c=0;								//  在sum中二分查找 x-ck的值是否存在即可

while(scanf("%d%d%d",&l,&n,&m)!=EOF)
{

for(i=1;i<=l;i++) scanf("%I64d",&A[i]);
for(i=1;i<=n;i++) scanf("%I64d",&B[i]);
for(i=1;i<=m;i++) scanf("%I64d",&C[i]);

k=0;
for(i=1;i<=l;i++) // 枚举 A B之和
{
for(j=1;j<=n;j++)
{

S[++k]=A[i]+B[j];

}
}

sort(S+1,S+k);
k=unique(S+1,S+k)-(S+1); //  unique ()去掉重复元素后返回最后一个元素的地址
k++; // 个数为地址差 加1

sort(C+1,C+m);

scanf("%I64d",&t);
printf("Case %d:\n",++c);
while(t--)
{

flag=0;
scanf("%I64d",&x);
if(x>S[k]+C[m]||x<S[1]+C[1])//
{
printf("NO\n");
continue;
}

for(i=1;i<=m;i++)
{
if(BS(x-C[i]))  //在sum中二分查找 x-ck的值是否存在即可
{
flag=1;
break;
}
}
if(flag)
{
printf("YES\n");
}
else
printf("NO\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: