丢瓶盖

原题链接:https://www.luogu.org/problem/show?pid=1316#sub

第三题。

这题和跳石头很像啊。相当于从A块石头中移走B块使最短跳跃距离最长。

我们二分跳跃距离然后代入模拟,其余的思路和跳石头就一样了,看代码也能看出来。

参考代码:

 1 #include <algorithm>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #define maxn 1000005
 6 using namespace std;
 7 int n,m,a[maxn];
 8 inline int read(){
 9     int num = 0;
10     char c;
11     bool flag = false;
12     while ((c = getchar()) == ' ' || c == '
' || c == '
');
13     if (c == '-')
14         flag = true;
15     else
16         num = c - '0';
17     while (isdigit(c = getchar()))
18         num = num * 10 + c - '0';
19     return (flag ? -1 : 1) * num;
20 }
21 bool check(int now){
22     int last=1,ans=1;
23     for(int i=2;i<=n;i++){
24         if(a[i]-a[last]>=now){
25             ans++;
26             last=i;
27         }
28     }
29     if (ans < m) 
30         return false;
31     else
32         return true;
33 }
34 
35 int main(){
36     n = read();m = read();
37     for(int i=1;i<=n;i++)
38         a[i] = read();
39 
40     sort(a+1,a+n+1);
41     int l=1;
42     int r=a[n]-a[1];
43     while(l <= r){
44         int mid = (l+r) >> 1;
45         if(check(mid)) 
46             l=mid+1;
47         else 
48             r=mid-1;
49     }
50     printf("%d
",l-1);
51     return 0;
52 }
原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7707462.html