• 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;
    }
     
  • 相关阅读:
    new的实现原理
    call, apply, bind的内部实现原理
    redux基础第二讲——react-redux
    redux基础第一讲
    React组件的数据
    ES6中的super
    ES5和ES6中实现对象和继承的方法对比
    react组件的生命周期
    浅谈js继承的几种方法
    LeetCode 5274. Number of Ways to Stay in the Same Place After Some Steps
  • 原文地址:https://www.cnblogs.com/cniwoq/p/6770904.html
Copyright © 2020-2023  润新知