P1316 丢瓶盖

题目描述

陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?

输入输出格式

输入格式:

 

第一行,两个整数,A,B。(B<=A<=100000)

第二行,A个整数,分别为这A个瓶盖坐标。

 

输出格式:

 

仅一个整数,为所求答案。

 

输入输出样例

输入样例#1: 复制
5 3
1 2 3 4 5
输出样例#1: 复制
2

说明

限时3秒

 

思路:贪心 + 二分

judge()函数判断输入是否合法, 再用二分来估计题目要求的最大值

 

#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 100010;
const int INF = 0x7fffffff;

int a[MAX], n, m;

bool judge(long long x)
{
	int num = 1, count = 1;
	for(int i = 2; i <= n; ++i)
	{
		if(a[i] - a[num] >= x)
		{
			count++;
			num = i;
		}
	}
	if(count >= m)
		return true;
	else
		return false;
}

int main()
{
	int left, right, mid, ans;
	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
		cin >> a[i];
	sort(a + 1, a + n+ 1);
	left = 0, right = a[n] - a[1];//注意左端点从0开始!!!!!!
	while(left <= right)
	{
		mid = left + (right - left) / 2;
		if(judge(mid))
		{
			left = mid + 1;
			ans = mid;
		}
		else
		{
			right = mid - 1;
		}
	}
	cout << ans << endl;
	return 0;
} 

  

posted @ 2019-01-16 11:53  青衫客36  阅读(257)  评论(0编辑  收藏  举报