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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugarbliss/article/details/89403389

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2141

题意:给你三组数,要你各从三组数中挑出一个,满足A[i]+B[j]+C[k]=X,若满足输出YES,否则NO。

思路:先将A、B求和并排序,然后在ab数组里二分搜索x - c。注意ab数组的大小。

#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int a[N], b[N], c[N], d[N*N], cnt;
int judge(int k)
{
    int l = 0, r = cnt - 1;
    while(l < r)
    {
        int mid =  (l + r) / 2;
        if(d[mid] > k) r = mid;
        else if(d[mid] < k) l = mid + 1;
        else return 1;
    }
    return 0;
}
int main()
{
    int k, n, m, s, x, cas = 1;
    while(~scanf("%d%d%d",&k,&n,&m))
    {
        for(int i = 0; i < k; i++) scanf("%d",&a[i]);
        for(int i = 0; i < n; i++) scanf("%d",&b[i]);
        for(int i = 0; i < m; i++) scanf("%d",&c[i]);
        cnt = 0;
        memset(d,0,sizeof(d));
        for(int i = 0; i < k; i++)
            for(int j = 0; j < n; j++)
                d[cnt++] = a[i] + b[j];
        sort(d, d + cnt);
        scanf("%d",&s);
        printf("Case %d:\n",cas++);
        for(int i = 0; i < s; i++)
        {
            scanf("%d",&x);
            int flag = 0;
            for(int j = 0; j < m; j++)
            {
                k = x - c[j];
                if(judge(k))
                {
                    flag = 1;
                    break;
                }
            }
            if(flag) puts("YES");
            else puts("NO");
        }
    }

}
/*
3 3 3
1 2 3
1 2 3
1 2 3
3
1
4
10
*/

猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/89403389