hdu2141Can you find it?

最开始看到这题SB的直接暴力,,卧槽,以后这种习惯要改,,2B青年穷举,普通青年对C二分,文艺青年对A+B二分。这就是这题的解释。因为500,500,500,1000的数据太大,所以只能二分,A+B二分的复杂度前者是500*500,后者是1000*500*log2(500*500),这是不会超时的,合并A+B的时候还有一点技巧就是讲A,B,C较大的两个求出来,然后合并。其实不这样也是可以的。这是处理的一个技巧;

#include<iostream>
using namespace std;
#include<stdio.h>
#include<algorithm>
__int64 a[505],b[505],c[505],d[505*505];
__int64 f[1005];
int main()
{
    int  L, N, M;
    int s;
    int i,j,k;
    int q=1;
    while(cin>>L>>N>>M)
    {
        for(i=0;i<L;i++)
            scanf("%I64d",&a[i]);
        for(i=0;i<N;i++)
            scanf("%I64d",&b[i]);
        k=0;
        for(i=0;i<L;i++)
            for(j=0;j<N;j++)
            d[k++]=a[i]+b[j];
        sort(d,d+k);
        for(i=0;i<M;i++)
            scanf("%I64d",&c[i]);
        sort(c,c+M);
        scanf("%d",&s);
        for(i=0;i<s;i++)
            scanf("%I64d",&f[i]);
        cout<<"Case "<<q++<<":"<<endl;
        for(int p=0;p<s;p++)
          {
              int leap=0;
          for(i=0;i<M;i++)
            {
            int low=0,high=k-1;
            int mid=(low+high)>>1;
            while(low<=high)
            {
             mid=(low+high)>>1;
            if(c[i]+d[mid]==f[p]){leap=1;break;}
            else if(d[mid]+c[i]<f[p])low=mid+1;
            else high=mid-1;
            }
            if(leap)break;
            }
        if(leap==1)cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
          }
    }
    return 0;
}

[ Copy to Clipboard ]     [ Save to File]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值