丢瓶盖
原题链接: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 == '\n' || c == '\r'); 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\n",l-1); 51 return 0; 52 }
一切无法杀死我的,都将使我变得更加强大。