Sumsets
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 10593   Accepted: 2890

Description

Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S.

Input

Several S, each consisting of a line containing an integer 1 <= n <= 1000 indicating the number of elements in S, followed by the elements of S, one per line. Each element of S is a distinct integer between -536870912 and +536870911 inclusive. The last line of input contains 0.

Output

For each S, a single line containing d, or a single line containing "no solution".

Sample Input

5
2
3
5
7
12
5
2
16
64
256
1024
0

Sample Output

12
no solution

Source

 
 
 
解析:折半枚举。之前碰到的折半枚举都是将集合折半,这次不同,折半的思想体现在等式上。将等式a + b + c = d转化为a + b = d - c,等式分成左右两部分,预处理出左右两部分,将左半部分排序,然后枚举右半部分,二分查找即可。时间复杂度为O(n2logn2)。
 
 
 
#include <cstdio>
#include <algorithm>
using namespace std; const int MAXN = 1000+5;
int n;
int a[MAXN]; struct S{
int val;
int i, j;
bool operator < (const S& b)const
{
return val < b.val;
}
};
S l[MAXN*MAXN], r[MAXN*MAXN]; bool ok(S& a, S& b)
{
return a.i != b.i && a.j != b.j && a.i != b.j && a.j != b.i;
} void solve()
{
int lcnt = 0;
for(int i = 0; i < n; ++i){
for(int j = i+1; j < n; ++j){
l[lcnt].val = a[i]+a[j];
l[lcnt].i = i;
l[lcnt++].j = j;
}
}
int rcnt = 0;
for(int i = 0; i < n; ++i){
for(int j = i+1; j < n; ++j){
r[rcnt].val = a[i]-a[j];
r[rcnt].i = i;
r[rcnt++].j = j;
r[rcnt].val = a[j]-a[i];
r[rcnt].i = j;
r[rcnt++].j = i;
}
}
sort(l, l+lcnt);
int res = 0xffffffff;
for(int i = 0; i < rcnt; ++i){
int d = lower_bound(l, l+lcnt, r[i])-l;
if(ok(l[d], r[i]) && l[d].val == r[i].val){
res = max(res, r[i].val+a[r[i].j]);
}
}
if(res == 0xffffffff)
printf("no solution\n");
else
printf("%d\n", res);
} int main()
{
while(scanf("%d", &n), n){
for(int i = 0; i < n; ++i)
scanf("%d", &a[i]);
solve();
}
return 0;
}

  

POJ 2549 Sumsets的更多相关文章

  1. POJ 2549 Sumsets(折半枚举+二分)

    Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11946   Accepted: 3299 Descript ...

  2. POJ 2549 Sumsets hash值及下标

    题目大意:找到几何中的4个数字使他们能够组成 a+b+c=d , 得到最大的d值 我们很容易想到a+b = d-c 那么将所有a+b的值存入hash表中,然后查找能否在表中找到这样的d-c的值即可 因 ...

  3. [poj] 2549 Sumsets || 双向bfs

    原题 在集合里找到a+b+c=d的最大的d. 显然枚举a,b,c不行,所以将式子移项为a+b=d-c,然后双向bfs,meet int the middle. #include<cstdio&g ...

  4. UVA 10125 - Sumsets(POJ 2549) hash

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. Divide and conquer:Sumsets(POJ 2549)

    数集 题目大意:给定一些数的集合,要你求出集合中满足a+b+c=d的最大的d(每个数只能用一次) 这题有两种解法, 第一种就是对分,把a+b的和先求出来,然后再枚举d-c,枚举的时候输入按照降序搜索就 ...

  6. POJ 2549:Subsets(哈希表)

    [题目链接] http://poj.org/problem?id=2549 [题目大意] 给出一个数集,从中选择四个元素,使得a+b+c=d,最小化d [题解] 我们对a+b建立Hash_table, ...

  7. POJ 2229 Sumsets

    Sumsets Time Limit: 2000MS   Memory Limit: 200000K Total Submissions: 11892   Accepted: 4782 Descrip ...

  8. POJ 2549 二分+HASH

    题目链接:http://poj.org/problem?id=2002 题意:给定一个n个数字组成的序列,然后求出4个数使得a+b+c=d,求d的最大值.其中a,b,c,d要求是给定序列的数,并且不能 ...

  9. POJ 2549

    Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8235   Accepted: 2260 Descripti ...

随机推荐

  1. 使用git代替FTP部署代码到服务器的例子

    这篇文章主要介绍了使用git代替FTP部署代码到服务器的例子,这种方法可以节省流量.节省时间,需要的朋友可以参考下 本地开发完成后,通常会在服务器上部署,有人会使用ftp,有人会使用scp, ftp和 ...

  2. POJ2586Y2K Accounting Bug

    http://poj.org/problem?id=2586 Description Accounting for Computer Machinists (ACM) has sufferred fr ...

  3. Android中使用HTTP和HttpClient进行通信

    /** * 使用HTTP的Get方式进行数据请求 */ protected void httpGet() { /** * 进行异步请求 */ new AsyncTask<String, Void ...

  4. lintcode :Trailing Zeros 尾部的零

    题目: 尾部的零 设计一个算法,计算出n阶乘中尾部零的个数 样例 11! = 39916800,因此应该返回 2 挑战 O(logN)的时间复杂度 解题: 常用方法: 也许你在编程之美中看到,通过求能 ...

  5. 【mongoDB基础篇②】PHP-mongo扩展的编译以及使用

    安装PHP-mongo扩展 安装php-mongo扩展和安装其他php扩展的步骤一样: #1.首先上http://pecl.php.net上面搜索mongo,得到下载地址 wget http://pe ...

  6. 服务器端json解析

    1.客户端通过http传上来的可定都是json数据啊,json数据传到服务器端,就要通过键值对getkey方法得到具体值,对吧,然后再操控具体值. 2.JSONObject与JSONArray: Js ...

  7. TCoolMemo

    我们先起个名字叫做TCoolMemo.以上篇已经讲了很多组件的技术,这里就只说出几个重点.其余不多说了. 首先,该Memo从CustomMemo继承,它有这样外观:属于平面的,边框是可以设置颜色的线, ...

  8. 247. Strobogrammatic Number II

    题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...

  9. 转AOP 介绍

    来自:http://blog.csdn.net/a906998248/article/details/7514969 这篇也不错,详细介绍了CGLIP http://blog.jobbole.com/ ...

  10. Java API —— Date类

    1.Date类概述 类 Date 表示特定的瞬间,精确到毫秒.  2.构造方法 public Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒). public Dat ...