首页 > 代码库 > 洛谷——P1316 丢瓶盖

洛谷——P1316 丢瓶盖

https://www.luogu.org/problem/show?pid=1316

题目描述

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

输入输出格式

输入格式:

 

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

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

 

输出格式:

 

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

 

输入输出样例

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

说明

限时3秒

 

把题目看作是拿走a-b个瓶盖后是剩下的最短距离最小,就变得和跳石头一样了

 1 #include <algorithm> 2 #include <cstdio> 3  4 using namespace std; 5  6 const int N(100000+15); 7 int a,b,x[N]; 8  9 int l,r,mid,ans;10 bool check(int dis)11 {12     int sum=0,cnt=0;13     for(int i=2;i<=a;i++)14     {15         sum+=x[i]-x[i-1];16         if(sum<dis) cnt++;17         else sum=0;18         if(cnt>a-b) return false;19     }20     return true;21 }22 23 int main()24 {25     scanf("%d%d",&a,&b);26     for(int i=1;i<=a;i++) scanf("%d",x+i);27     sort(x+1,x+a+1);28     for(r=x[a]-x[1];l<=r;)29     {30         mid=l+r>>1;31         if(check(mid))32         {33             l=mid+1;34             ans=mid;35         }36         else r=mid-1;37     }38     printf("%d",ans);39     return 0;40 }

 

洛谷——P1316 丢瓶盖