zoukankan      html  css  js  c++  java
  • HDU 2141 Can you find it?【二分查找是否存在ai+bj+ck=x】

    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

    【STL版本】

    #include<cstdio>
    #include<string>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #include<set>
    #include<queue>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<cctype>
    #include<stack>
    #include<sstream>
    #include<list>
    #include<assert.h>
    #include<bitset>
    #include<numeric>
    #define debug() puts("++++")
    #define gcd(a,b) __gcd(a,b)
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define fi first
    #define se second
    #define pb push_back
    #define sqr(x) ((x)*(x))
    #define ms(a,b) memset(a,b,sizeof(a))
    #define sz size()
    #define be begin()
    #define pu push_up
    #define pd push_down
    #define cl clear()
    #define lowbit(x) -x&x
    #define all 1,n,1
    #define rep(i,x,n) for(int i=(x); i<(n); i++)
    #define in freopen("in.in","r",stdin)
    #define out freopen("out.out","w",stdout)
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ULL;
    typedef pair<int,int> P;
    const int INF = 0x3f3f3f3f;
    const ll LNF = 1e18;
    const int maxn = 1e3 + 20;
    const int maxm = 1e6 + 10;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int dx[] = {-1,1,0,0,1,1,-1,-1};
    const int dy[] = {0,0,1,-1,1,-1,1,-1};
    int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    ll quickpow(ll a, ll b) {
        ll ans = 0;
        while (b > 0) {
            if (b % 2)ans = ans * a;
            b = b / 2;
            a = a * a;
        }
        return ans;
    }
    
    int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a%b);
    }
    
    
    bool cmp(int a, int b) {
        return a > b;
    }
    int l,n,m,q,x;
    int a[maxn],b[maxn],c[maxn];
    int ab[250005];
    /*
    ai + bj + ck = x ——>
    ai + bj = x -ck
    1 2 3
    1 2 3
    1 2 3
    */
    int main()
    {
        int cas = 1;
        while(~scanf("%d%d%d",&l,&n,&m))
        {
    
            int f = 0, k;
            ms(a,0),ms(b,0),ms(c,0),ms(ab,0);
            rep(i,0,l)
                scanf("%d",&a[i]);
            rep(i,0,n)
                scanf("%d",&b[i]);
            rep(i,0,m)
                scanf("%d",&c[i]);
            k = 0;
            rep(i,0,l)
            {
                rep(j,0,n)
                {
                    ab[k++] = a[i] + b[j];
                }
            }
            sort(ab,ab+k);
            sort(c,c+m);
            printf("Case %d:
    ",cas++);
            scanf("%d",&q);
            while(q--)
            {
    
                //在ab数组二分查找 x - c[i]
                f = 0;
                scanf("%d",&x);
                for(int j=0;j<m;j++)
                {
                    int pos = lower_bound(ab,ab+k,x-c[j]) - ab;
                    if(ab[pos] == x - c[j])
                    {
                        f = 1;
                        break;
                    }
                   
                }
                if(f) printf("YES
    ");
                else printf("NO
    ");
            }
        }
    }
    

    【手写二分版本】:

    #include<cstdio>
    #include<string>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #include<set>
    #include<queue>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<cctype>
    #include<stack>
    #include<sstream>
    #include<list>
    #include<assert.h>
    #include<bitset>
    #include<numeric>
    #define debug() puts("++++")
    #define gcd(a,b) __gcd(a,b)
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define fi first
    #define se second
    #define pb push_back
    #define sqr(x) ((x)*(x))
    #define ms(a,b) memset(a,b,sizeof(a))
    #define sz size()
    #define be begin()
    #define pu push_up
    #define pd push_down
    #define cl clear()
    #define lowbit(x) -x&x
    #define all 1,n,1
    #define rep(i,x,n) for(int i=(x); i<(n); i++)
    #define in freopen("in.in","r",stdin)
    #define out freopen("out.out","w",stdout)
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ULL;
    typedef pair<int,int> P;
    const int INF = 0x3f3f3f3f;
    const ll LNF = 1e18;
    const int maxn = 1e3 + 20;
    const int maxm = 1e6 + 10;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int dx[] = {-1,1,0,0,1,1,-1,-1};
    const int dy[] = {0,0,1,-1,1,-1,1,-1};
    int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    ll quickpow(ll a, ll b) {
        ll ans = 0;
        while (b > 0) {
            if (b % 2)ans = ans * a;
            b = b / 2;
            a = a * a;
        }
        return ans;
    }
    
    int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a%b);
    }
    
    
    bool cmp(int a, int b) {
        return a > b;
    }
    int l,n,m,q,x;
    int a[maxn],b[maxn],c[maxn];
    int ab[250005];
    /*
    ai + bj + ck = x ——>
    ai + bj = x -ck
    1 2 3
    1 2 3
    1 2 3
    */
    int main()
    {
        int cas = 1;
        while(~scanf("%d%d%d",&l,&n,&m))
        {
    
            int f = 0, k;
            ms(a,0),ms(b,0),ms(c,0),ms(ab,0);
            rep(i,0,l)
                scanf("%d",&a[i]);
            rep(i,0,n)
                scanf("%d",&b[i]);
            rep(i,0,m)
                scanf("%d",&c[i]);
            k = 0;
            rep(i,0,l)
            {
                rep(j,0,n)
                {
                    ab[k++] = a[i] + b[j];
                }
            }
            sort(ab,ab+k);
            sort(c,c+m);
            printf("Case %d:
    ",cas++);
            scanf("%d",&q);
            while(q--)
            {
    
                //在ab数组二分查找 x - c[i]
                f = 0;
                scanf("%d",&x);
                for(int j=0;j<m;j++)
                {
                    int l = 0, r = k - 1, mid;
                    while(l <= r)
                    {
                        mid = (l+r)/2;
                        if(ab[mid] == x-c[j])
                        {
                            f=1;break;
                        }
                        else if(ab[mid]<x-c[j]) l=mid+1;
                        else if(ab[mid]>x-c[j]) r=mid-1;
                    }
                    if(f) break;
    
                }
                if(f) printf("YES
    ");
                else printf("NO
    ");
            }
        }
    }
    
    
    
  • 相关阅读:
    REVERSE!REVERSE!REVERSE!
    java和数据结构的面试考点
    39. recover rotated sorted array恢复旋转排序数组
    33. Search in Rotated Sorted Array旋转数组二分法查询
    搜索旋转排序数组 II
    Eclipse 查找
    在Java中返回多个值
    Java的标识符
    fwprintf (File input/output) – C 中文开发手册
    CSS盒子模型介绍 | CSS Box Model: Introduction to the CSS box model (Miscellaneous Level 1) – CSS 中文开发手册
  • 原文地址:https://www.cnblogs.com/Roni-i/p/9358132.html
Copyright © 2011-2022 走看看