这是一道二分的题目,题目大概意思:一些石头排成一条线,第一个和最后一个不能去掉,其余的共可以去掉m块,要使去掉后石头间距的最小值达到最大。
没想到思路。。。。去看的别人的思路
统计当前中界mid为最小间距的情况下下,要丢多少个石头,然后在与m比较,相应的改变上下界
注意就是m与中界丢的石头数相等时,也不一定是最小距离,需要继续比较(因为不是mid直接和m比较,想想为什么!!)
14293038 h123120 3258 Accepted 432K 407MS C++ 1022B 2015-06-14 15:02:37
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int l,n,m;
int main()
{
while(cin>>l>>n>>m)
{
int* dist=new int[n+2];
dist[0]=0;
dist[n+1]=l;
int low=l;
int high=l;
for(int i=1; i<=n; i++)
cin>>dist[i];
sort(dist,dist+n+2);
for(int i=1; i<=n+1; i++)
{
low=min(low,dist[i]-dist[i-1]);
}
while(low<=high)
{
int mid=(high+low)/2;
int s_cnt=0,d_cnt=0;
for(int i=1; i<=n+1;)//统计以当前mid的为最小长度,要丢多少个石头
{
if((d_cnt+=dist[i]-dist[i-1])<=mid)
{
s_cnt++;
i++;
}
else
{
i++;
d_cnt=0;
}
}
if(s_cnt<=m) low=mid+1;//正确的值在low这边 ,等于但mid不一定是最大
else high=mid-1;
}
cout<<low<<endl;
delete dist;
}
}