关闭

poj2549 Sumsets双向搜索

标签: ACMpoj算法
122人阅读 评论(0) 收藏 举报
分类:

题意:给你一个含有n(n<=1000)个数的数列,问这个数列中是否存在四个不同的数a,b,c,d,使a+b+c=d;若存在则输出最大的d

思路:完全暴力的话O(n^4),会T,可以考虑双向搜索,公式变形为a+b=d-c;分别枚举a+b和c-d,将值和下标存在结构体中,再二分查找即可

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<map>
using namespace std;
struct Z{
int s;
int x;
int y;
bool operator < (const Z& b)const

    {

        return s < b.s;

    }
}z[1000005],m[1000005];
int n,a[1005];
bool ok(Z& a, Z& b)

{
    return a.x != b.x && a.y != b.y && a.x != b.y && a.y != b.x;
}
int main(){
while((cin>>n)&&n!=0){
int ans=-536870912;
for(int i=0;i<n;i++)
    cin>>a[i];
sort(a,a+n);
int k=0;
for(int i=0;i<n;i++)
   for(int j=i+1;j<n;j++){
    z[k].s=a[i]+a[j];
    z[k].x=i;
    z[k++].y=j;
   }
   int l=0;
for(int i=0;i<n;i++)
   for(int j=i+1;j<n;j++){
    m[l].s=a[i]-a[j];
    m[l].x=i;
    m[l++].y=j;
    m[l].s=a[j]-a[i];
    m[l].x=j;
    m[l++].y=i;
   }
   sort(z,z+k);
   for(int i=0;i<l;i++){
    int d=lower_bound(z,z+k,m[i])-z;
    if(ok(z[d],m[i])&&z[d].s==m[i].s)
        ans=max(ans,z[d].s+a[m[i].y]);
   }
   if(ans!=-536870912)
   cout<<ans<<endl;
   else cout<<"no solution"<<endl;
}
}


0
0

猜你在找
【直播】计算机视觉原理及实战—屈教授
【套餐】深度学习入门视频课程—唐宇迪
【套餐】Hadoop生态系统零基础入门--侯勇蛟
【套餐】嵌入式Linux C编程基础--朱有鹏
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】机器学习之凸优化——马博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5145次
    • 积分:686
    • 等级:
    • 排名:千里之外
    • 原创:67篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条