zoukankan      html  css  js  c++  java
  • HDU Problem 2141 Can you find it? 【二分】

    Can you find it?

    Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/10000 K (Java/Others)
    Total Submission(s): 23856    Accepted Submission(s): 6048


    Problem Description
    Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.
     
    Input
    There are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent the sequences B, in the forth line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.
     
    Output
    For each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".
     
    Sample Input
    3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
     
    Sample Output
    Case 1: NO YES NO
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #define MAX_N 500050
    using namespace std;
    const double ESP = 1e-5;
    const int INF = 1e8;
    int L[MAX_N], N[MAX_N], M[MAX_N], LN[MAX_N];
    int M1[MAX_N];
    int l, n, m, cnt;
    
    bool lower_bound(int x) {
        int lp = -1, rp = cnt - 1;
        while (rp - lp > 1) {
            int mid = (lp + rp)/2;
            if (LN[mid] >= x) rp = mid;
            else lp = mid;
        }
        //printf("%d %d
    ", x, LN[rp]);
        return LN[rp] == x;
    }
    
    int main() {
        int t, p;
        int cut = 0;
        while (scanf("%d%d%d", &l, &n, &m) != EOF) {
            printf("Case %d:
    ", ++cut);
            for (int i = 0; i < l; i++)
                scanf("%d", &L[i]);
            for (int i = 0; i < n; i++)
                scanf("%d", &N[i]);
            for (int i = 0; i < m; i++)
                scanf("%d", &M1[i]);
            //利用等式L[i]+N[i] = x - M[i]降低运行时间
            cnt = 0;
            for (int i = 0; i < l; i++) {
                for (int j = 0; j < n; j++) {
                    LN[cnt++] = L[i] + N[j];
                }
            }
            sort(LN, LN + cnt);
            //printf("%d
    ", LN[0]);
            scanf("%d", &t);
            while (t--) {
                bool flag = false;
                scanf("%d", &p);
                //用p减去M中的每一个元素
                for (int i = 0; i < m; i++) {
                    M[i] = p - M1[i];
                }
                sort(M, M + m);
                for (int i = 0; i < m; i++) {
                    if (lower_bound(M[i])) {
                        flag = true;
                        break;
                    }
                }
                if (flag)   printf("YES
    ");
                else printf("NO
    ");
            }
        }
        return 0;
    }
     
  • 相关阅读:
    cmanformat
    mysql-sql语言参考
    jQuery 判断多个 input checkbox 中至少有一个勾选
    Java实现 蓝桥杯 算法提高 计算行列式
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
  • 原文地址:https://www.cnblogs.com/cniwoq/p/6770904.html
Copyright © 2011-2022 走看看