思路:枚举+二分查找。
本听说可以用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; }
枚举+二分查找算法实践
本文介绍了一种利用枚举与二分查找技术解决特定问题的算法实现方案。通过枚举变量并使用二分查找来寻找符合条件的元素,提高了搜索效率。文章详细展示了算法的实现过程及代码细节。
1788

被折叠的 条评论
为什么被折叠?



