poj2549——Sumsets

枚举+二分查找算法实践
本文介绍了一种利用枚举与二分查找技术解决特定问题的算法实现方案。通过枚举变量并使用二分查找来寻找符合条件的元素,提高了搜索效率。文章详细展示了算法的实现过程及代码细节。

思路:枚举+二分查找。

本听说可以用hash解决,不过,感觉用排序更方便。结果一直tle,搜了报告,才知道,有降低复杂度的方法。

枚举d,用2个for()确定a,b.二分查找c。

#include<iostream> #include<string> #include<cstdio> #include<algorithm> using namespace std; #define N 1005 int 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; }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值