HDU_2141_CanYouFindIt

来源:互联网 发布:expect linux 编辑:程序博客网 时间:2024/05/06 22:09

题目算法为2分。

穷举显然超时。变换为a+b=x-c  

这里需要注意的是题目中a+b在同一组中要多次使用,因此用一个另外的数组生成这个。

在a+b的数组中二分查找x-c即可。因为a+b是比x-c更大的数组。

输出大写小写搞错了,结果查了半天的代码。以后注意。

#include <iostream>#include<stdio.h>#include<algorithm>using namespace std;const int M=505;int s1[M],s2[M],s3[M];int ss[M*M];int bs(int l,int key){    int lo=0,hi=l-1;    int mid;    while(lo<=hi)    {        mid=(lo+hi)>>1;        if(ss[mid]==key)            return 1;        else if(ss[mid]>key)            hi=mid-1;        else            lo=mid+1;    }    return 0;}int fx(int l1,int p,int k){    for(int i=0;i<l1;i++)    {        if(bs(p,k-s1[i]))        return 1;    }    return 0;}int main(){    //freopen("A.txt","r",stdin);学习使用这种方法输入数据    int l1,l2,l3;    int n;    int x;    int nn=1;  //总的组数    while(scanf("%d%d%d",&l1,&l2,&l3)!=EOF)    {        for(int i=0;i<l1;i++)            scanf("%d",&s1[i]);        for(int i=0;i<l2;i++)            scanf("%d",&s2[i]);        for(int i=0;i<l3;i++)            scanf("%d",&s3[i]);        scanf("%d",&n);        printf("Case %d:\n",nn);        nn++;        int p=0;        for(int i=0;i<l2;i++)            for(int j=0;j<l3;j++)                ss[p++]=s2[i]+s3[j];//二分只是这个题目的一部分 这里是关键        sort(ss,ss+p);          //对大的数组进行排序二分        while(n--)        {            scanf("%d",&x);            if(fx(l1,p,x))                printf("YES\n");//注意输出的大小写            else                printf("NO\n");        }    }    return 0;}

0 0
原创粉丝点击