zoukankan      html  css  js  c++  java
  • hdu 2141 Can you find it? 二分查找

    三个整数数列A,B,C。给若干个数X,若能找到Ai+Bj+Ck = X(Ai是数列A中的某一个数,Bj,Ck同理),输出YES,否则输出NO。
    先是做A和B数列各元素的和并排序,接下来只要二查找X-C,就可以了。

    #include <iostream>
    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <queue>
    #include <algorithm>
    using namespace std;
    int a[501],b[501],c[501],sum[250001],L,M,N,k;
    bool find(int x)
    {
        int i,low,high,t,mid;
            for(i=0;i<N;i++)
            {
            t=x-c[i];
            mid=(N-1)/2;
            low=0;high=k-1;
            while(low<=high)
            {
                if(sum[mid]==t)
                {
                    printf("YES\n");
                    return true;
                }
                else if(t<sum[mid])
                    high=mid-1;
                else
                    low=mid+1;
                mid=(low+high)/2;
            }
        }
        return false;
    }
    int main()
    {
        int S,x,cas=1,i,j;
        while(scanf("%d%d%d",&L,&M,&N)!=EOF)
        {
            for(i=0;i<L;i++)
            scanf("%d",&a[i]);
            for(i=0;i<M;i++)
            scanf("%d",&b[i]);
            for(i=0;i<N;i++)
            scanf("%d",&c[i]);
            k=0;
            for(i=0;i<L;i++)
            for(j=0;j<M;j++)
            sum[k++]=a[i]+b[j];
            sort(sum,sum+k);
            scanf("%d",&S);
            printf("Case %d:\n",cas++);
            while(S--)
            {
                scanf("%d",&x);
                if(!find(x))
                printf("NO\n");
            }
        }
        return 0;
    }

                       

              
  • 相关阅读:
    B1028人口普查
    B1004成绩排名
    B1041考试座位号
    A1009 Product of Polynomials多项式相乘
    A1002 A+B for Polynomials 多项式相加
    B1010一元多项式求导
    A1065 A+Band C(64 bit)
    A1046 Shortest Distance 最短路径
    排序
    windows 平台使用wireshark命令行抓包
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740250.html
Copyright © 2011-2022 走看看