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: 10533   Accepted: 2863 ...
  • qq_33362864
  • qq_33362864
  • 2016年08月08日 18:10
  • 204

poj2549——Sumsets

思路:枚举+二分查找。本听说可以用hash解决,不过,感觉用排序更方便。结果一直tle,搜了报告,才知道,有降低复杂度的方法。枚举d,用2个for()确定a,b.二分查找c。#include #in...
  • k1246195917
  • k1246195917
  • 2011年04月08日 14:28
  • 482

poj2549 Sumsets(折半枚举)

题目大意: 给定一个整数数列,从中选出一个四个不同的元素a,b,c,d组成一个新的集合,使得a+b+c=d,求得满足条件的最大的d,否则输出no solution。 解决方法: 这一题如果使用传...
  • lolicon480
  • lolicon480
  • 2015年03月09日 11:26
  • 320

POJ2549 Sumsets 折半枚举

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

poj2549 Sumsets(中途相遇法)

题目链接:https://vjudge.net/problem/POJ-2549 题目大意:给你一组数字,从数字里选择a,b,c,d四个数字(四个数字各不相同),满足a+b+c=d; 题目思路:如...
  • qq_29980371
  • qq_29980371
  • 2017年07月26日 17:24
  • 117

Uva10125/POJ2549——Sumsets(中途相遇法,hash)

A. Sumsets Time Limit: 3000ms Memory Limit: 131072KB 64-bit integer IO format: %lld      ...
  • tyh24689
  • tyh24689
  • 2014年11月10日 19:31
  • 343

POJ 229 Sumsets

POJ 2229题目大意如下: 要求将一个正整数分解成2的指数幂的形式,问这样的分解有多少种方式。 这本来是一个很简单的Dynamic Programming,但是有时候算法题写多了似乎会忘记最初的最...
  • kornberg_fresnel
  • kornberg_fresnel
  • 2016年03月02日 22:33
  • 255

poj2549

今天好心塞!!!先是//TLE了 0.0 #include #include #include #include #include using namespace std; long long a[...
  • Slow_Wakler
  • Slow_Wakler
  • 2015年04月14日 21:48
  • 400

POJ-2229-Sumsets

这个题要求求出一个数n可以有多少种写成2的次幂和的形式。 参考了下网上大牛写的教程,自己也总结了下。 地址:http://ip96cns.blog.163.com/blog/static/1700...
  • z309241990
  • z309241990
  • 2013年04月09日 19:00
  • 1239

HDU2709 Sumsets【递推】

题目大意: 将一个整数N分解成2^i相加的形式,共有多少种分法。例如:7 = 1+1+1+1+1+1+1 = 1+1+1+1+1+2 = 1+1+1+2+2 = 1+1+1+4 = 1+2+2+2 ...
  • u011676797
  • u011676797
  • 2015年04月08日 10:19
  • 681
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2549 Sumsets双向搜索
举报原因:
原因补充:

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