六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 36|回复: 0

poj2549——Sumsets

[复制链接]

升级  93.8%

309

主题

309

主题

309

主题

进士

Rank: 4

积分
969
 楼主| 发表于 2013-1-26 13:37:41 | 显示全部楼层 |阅读模式
思路:枚举+二分查找。
本听说可以用hash解决,不过,感觉用排序更方便。结果一直tle,搜了报告,才知道,有降低复杂度的方法。
枚举d,用2个for()确定a,b.二分查找c。
#include<iostream>#include<string>#include<cstdio>#include<algorithm>using namespace std;#define N 1005int maxsum,n;bool flag;bool search(int left,int right,int key,int k1,int k2,int b[]){int mid;while(left<=right){int mid=(left+right)>>1;if(b[mid]==key&&mid!=k1&&mid!=k2) return true;if(b[mid]>key)right=mid-1;else if(b[mid]<key)left=mid+1;}return false;}int main(){int i,a[N],j,k;while(scanf("%d",&n)&&n){flag=false;for(i=1;i<=n;i++)scanf("%d",&a[i]);if(n<3)cout<<"no solution"<<endl;else {maxsum=-999999999;sort(a+1,a+1+n);int b[N];int cnt=1;i=1;while(i<=n){b[cnt++]=a[i];int k=i;while(i<=n&&a[k]==a[i])i++;}for(k=cnt-1;k>=1;k--){maxsum=b[k];for(i=cnt-1;i>=1;i--){if(k==i) continue;if(b[i]+b[0]+b[1]>maxsum) continue;for(j=i-1;j>=1;j--){if(j==i||j==k) continue;if(search(1,j-1,maxsum-b[i]-b[j],k,i,b)){flag=true;goto end;}}}}end:if(flag) cout<<maxsum<<endl;else cout<<"no solution"<<endl;}}return 0;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表