poj2549 Sumsets双向搜索

原创 2017年01月03日 00:18:13

题意:给你一个含有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;
}
}


相关文章推荐

POJ2549-Sumsets【折半搜索】

原题链接 Sumsets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10698 Accepte...

UVA 10125 - Sumsets(POJ 2549) hash

给定一个整数几何S,找出一个最大的d,使得a+b+c=d,其中a,b,c,d是S中不同的元素。 S的个数最大为1000。...

poj 2549 双向搜索

Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8665   Accepted: 2395 ...
  • HTT_H
  • HTT_H
  • 2015年02月11日 21:05
  • 287

POJ2549 Sumsets 折半枚举

题目大意是,一个集合中有N个元素,找出最大的S,满足条件A+B+C=S,并且这四个数都属于该集合,N不超过1000.         如果直接枚举O(n^4)显然复杂度太高,将等式转化一下A+B=S...

poj 2549 Sumsets(折半枚举)

因为要找a+b+c=d,所以可以写成,a+b=d-c,枚举d,c,ran hou

poj2549 Sumsets

Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10533   Accepted: 2863 ...

Poj 2549 Sumsets (3Sum问题)

题意:给出一个数集,问其中是否存在a,b,c,d满足a+b+c=d,输出最大的d 理论学习:http://blog.csdn.net/doc_sgl/article/details/12462151...

poj 2549 Sumsets

hash应用。a+b+c=d,各个值都是不等的,用四个循环肯定超时,所以把c移到右边,则变成两个两重循环。把数存于s[]数组中。因为这些数比较大,所以把取模作为hash函数,关键值就是abs(s[i]...

poj 2549 Sumsets(hash)

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23666 a+b+c=d 转化: a+b=d-c。这就变成了查找问题。1...

Sumsets poj 2229 c++

Sumsets Time Limit: 2000MS   Memory Limit: 200000K Total Submissions: 12696   Acce...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2549 Sumsets双向搜索
举报原因:
原因补充:

(最多只允许输入30个字)