洛谷 P2678 跳石头

题目传送门

解题思路:

人生中第一道二分答案的题,小车问题那道不算.

二分枚举一个答案,验证,如果小于当前枚举答案值,就需要去掉石头,看最后如果比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

posted @ 2019-10-27 22:35  Mr^Simon  阅读(116)  评论(0编辑  收藏  举报