• HDU 2141:Can you find it?(二分)


    在三个数组中各选一个数,判断相加是否能得到目标数。一开始想暴力发现impossible~

    联系到二分,经过学长指点才将前两个数组合并,将前两个数组所有可能的和保存在新数组中,再根据第三个数组,二分查找新数组以判断是否有所需的数

    #include"cstdio"
    #include"cstring"
    #include"algorithm"
    #define MAXN 505
    using namespace std;
    int sum[MAXN*MAXN];
    int tail=0,p=1;
    bool judge(int b,int target)
    {   int low=0,high=tail-1;
        while(low<=high)
        {   int mid=(low+high)/2;
            if(sum[mid]+b==target) return true;
            else if(sum[mid]+b<target) low=mid+1;
            else high=mid-1;
        }
        return false;
    }
    int main()
    {   int len1,len2,len3;
        while(scanf("%d%d%d",&len1,&len2,&len3)!=EOF)
        {   int num1[MAXN],num2[MAXN],num3[MAXN];
            for(int i=0;i<len1;i++) scanf("%d",&num1[i]);
            for(int i=0;i<len2;i++) scanf("%d",&num2[i]);
            for(int i=0;i<len3;i++) scanf("%d",&num3[i]);
            sort(num3,num3+len3);
            tail=0;
            memset(sum,0,sizeof(sum));
            for(int i=0;i<len1;i++)
                for(int j=0;j<len2;j++)
                    sum[tail++]=num1[i]+num2[j];
            sort(sum,sum+tail);
            int n;
            scanf("%d",&n);
            printf("Case %d:
    ",p++);
            while(n--)
            {   int temp,i=0,ok=0;
                scanf("%d",&temp);
                while(!ok&&i<len3)
                   if(judge(num3[i++],temp)) ok=1;
                if(ok) printf("YES
    ");
                else printf("NO
    ");
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    实现Runnable接口和继承Thread类的区别
    图的DFS和BFS
    图建模
    数据结构-图的基本知识和表示
    除自身以外的乘积数组(力扣第238题)
    MapReduce源码分析--Shuffle阶段
    转到博客园
    vue中使用剪切板插件 clipboard.js
    vue中使用vue-qrcode生成二维码
    h5中嵌入视频自动播放的问题
  • 原文地址:https://www.cnblogs.com/luxiaoming/p/4670953.html
Copyright © 2020-2023  润新知