题目传送门
解题思路:
人生中第一道二分答案的题,小车问题那道不算.
二分枚举一个答案,验证,如果小于当前枚举答案值,就需要去掉石头,看最后如果比m大,说明答案大了,否则就是小了或正好,知道答案区间l和r长度小于0时,就是答案.
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 int q,n,m,a[50001],mid,ans; 7 8 inline bool ch(int len) { 9 int sum = 0,now = 0; 10 for(int i = 1;i <= n; i++) 11 if(a[i] - a[now] < len) 12 sum++; 13 else 14 now = i; 15 if(sum > m) 16 return false; 17 return true; 18 } 19 20 int main() { 21 scanf("%d%d%d",&q,&n,&m); 22 a[0] = 0;a[n+1] = q; 23 for(int i = 1;i <= n; i++) 24 scanf("%d",&a[i]); 25 int l = 1,r = q; 26 while(l <= r) { 27 mid = (l + r) / 2; 28 if(ch(mid)) 29 l = mid + 1; 30 else if(!ch(mid)) 31 r = mid - 1; 32 } 33 printf("%d",r); 34 return 0; 35 }
//NOIP提高2015 Day2 T1