POJ2459 Sumsets

来源:互联网 发布:修改游戏数据 编辑:程序博客网 时间:2024/06/14 20:22

原题链结


第一次写博客..

这道题也是我A掉的第一道折半枚举的题

之前也在网上搜了下这道题的题解 发现没有人用我这种方法..

其实思路还是一样的, 只不过不同点体现在对lower_bound的利用上

直接上代码  看注释

#include<cstdio>#include<algorithm>#include<cstdlib>#include<cstring>#include<string>#include<stack>#include<queue>#include<iostream>#include<cmath>#include<map>#include<list>#include<stack>typedef long long ll;using namespace std;int n;int a[1005];struct node{int i,j;int val;}b[1005*1005];bool cmp(node a,node b){    return a.val<b.val;}bool comp1(node a,int b){    return a.val<b;  // 找到第一个val>=b的结构体元素}bool comp2(node a,int b){    return a.val<=b; // 找到第一个val>b的结构体元素}int main(){    while(scanf("%d",&n)==1&&n)    {        int i,j,k,m,t;        for(i=0;i<n;i++)            scanf("%d",a+i);        sort(a,a+n);        int len=0;        for(i=0;i<n;i++)        {            for(j=i+1;j<n;j++)            {                if(a[i]!=a[j])  //这里直接判断一下 不同的话再存 以后就可以减少这部判断啦                {                    b[len].i=i;                    b[len].j=j;                    b[len].val=a[i]+a[j]; //存储题意中的 a+b                    len++;                }            }        }        sort(b,b+len,cmp);  //根据a+b的值从小到大排序        bool flag=false;        for(i=n-1;i>=0;i--) //之前已经从小到大对sort了 所以直接从最大的开始        {            int d=a[i];  //我们要找的d            for(j=0;j<i;j++)            {                if(d!=a[j]) //d不能等于c                {                    int cd=d-a[j];  //cd的值就相当于d-c                    node* p1=lower_bound(b,b+len,d-a[j],comp1);                    node* p2=lower_bound(b,b+len,d-a[j],comp2);//注意我写的两个函数comp, 而且都是作为lower_bound的参数                    if(p2-p1!=0)  //说明存在 a+b==d-c                    {                        while(p1!=p2) //还要判断一下a,b,c,d是否都不相同                        {                            if(a[p1->i]!=a[j]&&a[p1->i]!=a[i]&&a[p1->j]!=a[j]&&a[p1->j]!=a[i])                            {                                flag=true;  //符合题意 直接跳出                                break;                            }                            p1++;                        }                    }                }                if(flag)  //符合题意 直接跳出                    break;            }            if(flag)break;  //符合题意 直接跳出        }        if(flag)printf("%d\n",a[i]); //符合题意 直接输出d 也就是a[i]        else printf("no solution\n");    }    return 0;}


1 0
原创粉丝点击