hdu 2141 二分查找

来源:互联网 发布:遗传算法举例说明原理 编辑:程序博客网 时间:2024/06/06 03:14

感觉自己一直木有掌握二分的思想,看完这道题后,题意很简单,想直接暴力枚举,但是写到一半,就放弃了,因为看到了数据  500 *  500 * 500,再加上多组询问

很可能就挂了,其实知道可以二分做,但就是不知道咋弄....自己还太菜了~~~~果断参考别人的解题报告,自己敲了两边,第一遍超时,第二遍过了

a+b+c=x; 也就是  判断 a+b=x-c

先两层循环把所有的a+b算出来,然后再判断x-c 是不是在这个里面,二分时间复杂度好像是O(log n)吧~~~

附上代码:

#include <iostream>
#include <algorithm>
#define N 510
typedef long long ll;
using namespace std;
ll a[N],b[N],c[N];
ll sum[N*N];
ll num;
int find(ll x)
{
  int low=0;
  int high=num-1;
  int mid;
  while(low<=high)
  {
    mid=(low+high)/2;
    if(sum[mid]==x)return 1;
    else if(sum[mid]>x) high=mid-1;
    else low=mid+1;
  } 
  return 0;
}
int main()
{
 ll l,n,m,s,test=0;
 while(cin>>l>>n>>m)
 {
   test++;
   for(int i=0;i<l;i++)
    cin>>a[i];
   for(int i=0;i<n;i++)
    cin>>b[i];
   for(int i=0;i<m;i++)
    cin>>c[i];
   num=0;
   for(int i=0;i<l;i++)
    for(int j=0;j<n;j++)
      sum[num++]=a[i]+b[j];
   sort(sum,sum+num);
   cin>>s;
   printf("Case %lld:\n",test);
   while(s--)
   {
     ll x,flag=0;
     cin>>x;
     for(int i=0;i<m;i++)
     {
       if(find(x-c[i]))  
         {
           flag=1;
           break;  
         }
     }
     if(flag)printf("YES\n");
     else printf("NO\n");
   }
 }
 return 0;   
}

0 0
原创粉丝点击