luogu P1316 丢瓶盖 |二分答案

题目描述

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

输入格式

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

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

输出格式

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


一道练习二分的经典例题

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll f[100001];ll a,b;
bool check(ll x)
{
	ll ans=0,last=-(1<<30);
	for(int i=1;i<=a;i++)
	{
		if(f[i]-last>=x)
		{
		//	cout<<i<<" ";
			last=f[i];
			ans++;
			if(ans>=b)return 1;
		}
	}
	return 0;
}
int main()
{
	cin>>a>>b;
	ll ansmax=0;
	for(int i=1;i<=a;i++)
	{
		scanf("%lld",&f[i]);
		ansmax=max(ansmax,f[i]);
	}

	sort(f+1,f+a+1);
	ll l=0,r=ansmax+1;
	ll ans=0;
	while(l<=r)
	{
		ll mid=(l+r)/2;
		if(check(mid))
		{
			l=mid+1;
			ans=max(ans,mid);
		}
		else 
		r=mid-1;
	}
	cout<<ans;
}
原文地址:https://www.cnblogs.com/naruto-mzx/p/11846810.html