首页 > 学院 > 开发设计 > 正文

HDU-2141

2019-11-10 18:32:13
字体:
来源:转载
供稿:网友
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. InputThere 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. OutputFor 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 31 2 31 2 31 2 331410Sample Output
Case 1:NOYESNO
这道题就是首先想到会将他们三个数表的所有情况列出来,放进一个数组里,但是这样去做的时候,就会超
出限制,也就是会出现memory limited exceed,再去看题目的要求,发现这里的每一个数表的大小是500,
三个数表的大小相乘。就会超过10000kb的限制,但是如果是两个数表的大小乘起来的话,就不会超过限制,
所以可以想到,先将两个数表的和算出来,然后再根据答案,在剩下的一个数表中用二分法找答案,由于二
分法是需要数表有序的,就可以用头文件algorithm中的sort,当然这就是具体的解体细节了,然后将思路实
现这样就可以ac了
#include<iostream>#include<algorithm>using namespace std;int find_need(int a[],int s,int need){    int low = 0;    int high = s-1;    while(low<high)    {        int mid = (low+high)/2;        if(a[low]==need||a[high]==need||a[mid]==need) return true;        else if(a[mid]>need) high = mid-1;        else low = mid+1;    }    return false;}int main(){    int times = 0;    int anum,bnum,cnum;    while(cin>>anum>>bnum>>cnum)    {        times++;        cout<<"Case "<<times<<":"<<endl;        int ava[anum],bva[bnum],cva[cnum];        for(int i = 0;i<anum;i++)            cin>>ava[i];        for(int i = 0;i<bnum;i++)            cin>>bva[i];        for(int i = 0;i<cnum;i++)            cin>>cva[i];        int sum[bnum*cnum];        int help = 0;        for(int i = 0;i<bnum;i++)        {            for(int j = 0;j<cnum;j++)            {                sum[help] = bva[i]+cva[j];                help++;            }        }        sort(sum,sum+bnum*cnum);        int xnum;        cin>>xnum;        int yes[xnum];        int xva[xnum];        for(int i = 0;i<xnum;i++)        {            yes[i] = 0;            cin>>xva[i];            for(int j = 0;j<anum;j++)            {                if(find_need(sum,bnum*cnum,xva[i]-ava[j]))                {                    yes[i] = 1;                    break;                }            }            if(yes[i]==1) cout<<"YES"<<endl;            else cout<<"NO"<<endl;        }    }}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表