关闭

poj--2549--Sumsets(二分查找)

172人阅读 评论(0) 收藏 举报
分类:
Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u

Status

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

Waterloo local 2001.06.02

/*在数列中找四个数使a+b+c=d;转化之后得a+b=d-c,先对数列排序列举每一个d-c,
二分查找a和b*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX 100100
#define INF -0x3f3f3f
int a[MAX];
int main()
{
	int n;
	while(scanf("%d",&n),n)
	{
		for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
		sort(a,a+n);
		int ans=INF;
		for(int i=n-1;i>=0;i--)
		{
			for(int j=n-1;j>=0;j--)
			{
				if(i==j)
				continue;
				int sum=a[i]-a[j];
				int l=0,r=j-1;
				while(l<r)
				{
					if(a[l]+a[r]==sum)
					{
						ans=a[i];
						break;
					}
					 if(a[l]+a[r]>sum)
					r--;
					else 
					l++;
				}
				if(ans!=INF) break;
			}
			if(ans!=INF) break;
		}
		if(ans!=INF)
		printf("%d\n",ans);
		else
		printf("no solution\n");
	}
	return 0;
}


0
0
查看评论

二分查找的一些注意事项

二分查找的一些注意事项 二分查找介绍 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 二分查找的应用二分查找作为O(log(n))O(log(n))时间复杂度的查找算法得到了广泛的使用。 1.在已排序的数组中查找特...
  • zhouyelihua
  • zhouyelihua
  • 2015-06-27 23:58
  • 2406

poj--2549--Sumsets(二分)

Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9986   Accepted: 2733 Description Given ...
  • qq_29963431
  • qq_29963431
  • 2016-03-27 19:31
  • 158

二分查找算法(递归与非递归两种方式)

首先说说二分查找法。 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标。 采用非递归方式完成二分查找法。java代码如下所示。
  • lovesummerforever
  • lovesummerforever
  • 2014-04-27 15:44
  • 86814

编程之美之二分查找总结

二分查找
  • fangjian1204
  • fangjian1204
  • 2014-08-20 15:47
  • 1230

c++实现二分查找

简要描述: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。 条件:查找的数组必须要为有序数组。 二分查找的过程剩简要描述如下图: 二种实现方式 1.递归 /* arrat:数组 , low:上界; high:下界; t...
  • luoweifu
  • luoweifu
  • 2013-11-17 22:25
  • 6435

二分查找各种情况大总结

二分查找多次刷题时遇到,虽然每次也能写对,但花了蛮多时间,没好好想过。而且网上的太多版本,并不是很简洁,而且边界条件变化情况太多,容易混淆,下面是自己对二分查找的一些思考和总结,尽量写得简单易懂。 三种基本版本: 1.1 二分查找原始版--查找某个数的下标(任意一个) 在有序数组中查找某个数,找...
  • yefengzhichen
  • yefengzhichen
  • 2016-08-30 21:40
  • 12285

二分查找的两种实现方式(JAVA)

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两...
  • as02446418
  • as02446418
  • 2015-08-11 22:22
  • 2951

含有重复元素的二分查找算法

rust已经有binary_search了,但不能很好的处理有重复元素的查找。 下面这个是我按照网上查找到的原理自己实现的,这个处理重复元素比较好,如果key有重复,那么总是查找到最小的那个indexfn main() { let s = [0, 0,0,0,0,1,1,1, 1, 1, ...
  • varding
  • varding
  • 2015-09-18 10:19
  • 2494

无序数组的二分查找

对于有序数组,我们只需要简单的二分查找就可以了,但是对于无序数组,我们可以先排序在二分,但还有一种技巧就是结合快排的思想,即每次选择一个关键字,先将比他大的数放在其右边,比他小的数放在其左边,然后比较他和要查找的数的关系,并选择下次迭代的区间。 #include int e[1000010]; ...
  • jinjiahao5299
  • jinjiahao5299
  • 2015-03-09 13:14
  • 1453

二分查找及变种

//有重复元素找到重复元素最大那个的index,没有找到上界限 public int binarySearchLast(int []a ,int key){ int l = 0, h = a.length - 1, mid; int p = -1; while (l <= h) ...
  • litoupu
  • litoupu
  • 2014-11-14 10:45
  • 827
    个人资料
    • 访问:161331次
    • 积分:7632
    • 等级:
    • 排名:第3357名
    • 原创:628篇
    • 转载:7篇
    • 译文:0篇
    • 评论:23条
    最新评论