Sumsets(3sum问题,枚举d,c二分a+b)

Sumsets

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 9997   Accepted: 2736

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题解:给一个序列,让找不同的a,b,c,d在集合s中,使得a+b+c=d,如果能找到输出d,否则输出no solution;乍一看完全没思路,也许不敢动手去写,可以选从大到小排序,枚举d,c;二分a+b等于d-c即可;
extern "C++"{
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
void SI(int &x){scanf("%d",&x);}
void SI(double &x){scanf("%lf",&x);}
void SI(char *x){scanf("%s",x);}
//void SI(LL &x){scanf("%lld",&x);}

void PI(int &x){printf("%d",x);}
void PI(double &x){printf("%lf",x);}
void PI(char *x){printf("%s",x);}
//void PI(LL &x){printf("%lld",x);}

}
const int MAXN = 1010;
int a[MAXN];

int main(){
	int n;
	while(scanf("%d",&n),n){
		for(int i = 0;i < n;i++)SI(a[i]);
		sort(a,a + n);
		int ans,flot = 0;
		for(int i = n - 1;i >= 0;i--){
			if(flot)break;
			for(int j = n - 1;j >= 0;j--){
				if(flot)break;
				if(i == j)continue;
				int sum = a[i] - a[j],l = 0,r = j - 1;
				while(l < r){
					if(a[l] + a[r] == sum && i != l && i != r){
						ans = a[i];
						flot = 1;
						break;
					}
					if(a[l] + a[r] > sum)
						r--;
					else
						l++;
				}
			}
		}
		if(flot)
			printf("%d\n",ans);
		else
			puts("no solution");
	}
	return 0;
}

  

时间: 2024-10-29 18:43:05

Sumsets(3sum问题,枚举d,c二分a+b)的相关文章

HDOJ 4430 Yukari&#39;s Birthday 【枚举】+【二分】

题意:有一个蛋糕,将所有的蜡烛摆成一个以中心为同心轴的同心圆(中心可以放一个或者一个也不放,由近到远编号(1~r)每一个圆上分别放k^i(i是第几个的序号, k>=2)), 给你总的蜡烛数,让你求出k*r最小的,如果k*r相等,取r较小的. 分析:由等比数列可得k^0+k^1+...+k^r = (1-k^(r+1))/(1-k) 小于等于10e12,k最小是2,算出来r<40,那么我们可以枚举r,然后二分查找k,但是如果按照正常的二分,TL了(6s都TL...),分析发现,算幂的时候可能会溢

【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate

[法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意dis的初值0x7f)<=Time ? 1 : 0); 判断是否满流; #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; #d

poj 1840 Eqs 【解五元方程+分治+枚举打表+二分查找所有key 】

Eqs Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 13955   Accepted: 6851 Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The coefficients are given integers from the interval [-50,50]. It i

【枚举】【二分】【推导】Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) D. Resource Distribution

题意:有两个服务要求被满足,服务S1要求x1数量的资源,S2要求x2数量的资源.有n个服务器来提供资源,第i台能提供a[i]的资源.当你选择一定数量的服务器来为某个服务提供资源后,资源需求会等量地分担给它们,要求每台服务器承担的资源需求不超过其所能提供的资源需求.给定一种合法的方案,每台服务器要么没有被分配给任何一个服务,或者被分配给其中一个服务. 对服务器按能提供的资源从小到大排序.枚举给S1分配的服务器数量i,然后在a数组中二分,就可以得到给S1提供的是哪i台服务器,它们占据了a数组中连续的

ural 1133 Fibonacci Sequence 二分枚举

给出Fibonacci的第i项和第j项.求第n项. Input The input contains five integers in the following order: i, Fi, j,Fj, n.−1000 ≤ i, j, n ≤ 1000, i ≠ j,−2·109 ≤ Fk ≤ 2·109 (k = min(i, j, n), …, max(i, j, n)). Output The output consists of a single integer, which is th

poj 2549 折半枚举+二分

三重循环肯定TLE,所以采用“折半枚举”的方法+二分查找来提高速度,不同的是需要保存两个下标用来判定是否有重复元素. 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 7 const int N = 1000; 8 int a[N]; 9 int n, cnt; 10 11 struct

leetcode_15 3Sum(TwoPointers)

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. For example, given array S = [-1,

LA 3268 号码簿分组(最大流+二分)

https://vjudge.net/problem/UVALive-3268 题意: 有n个人和m个组.一个人可能属于很多组.现在请你从某些组中去掉几个人,使得每个人只属于一个组,并使得人数最多的组中人员数目为最小值. 思路:建立超级源汇点,源点和每个人相连,容量为1,说明每个人最多只能在一个组中.每个人和可以属于的组相连,容量为1.接下来枚举组的最大容量值,将每组和汇点相连,容量为枚举值,二分跑最大流即可. 1 #include<iostream> 2 #include<algori

5289 Assignment (RMQ+二分区间)

题目链接:5289 Assignment 题意:给出n和K,表示有一串n个数的序列,存在多少个区间,该区间中任意两个数的差小于k 思路: 1.区间任意两个数的小于K 等价于 区间max-min<k,用RMQ来维护,区间最大最小值 2.最后暴力枚举区间必定要超时,发现随着区间的扩大max-min的值也在变大(非递减),有单调性就容易想到二分,所以是枚举左端点,二分找右端点. AC代码: #include<stdio.h> #include <algorithm> using n