最小值最大化问题,刚开始没思路,还是经che兄提醒,用二分,然后百度之,抄了一份。不过我是个有原则的人,就算要抄,也是要先理解才行,然后手打一份。为了证明彻底理解,偶尔还会小改动一下,比如把数组从1开始改为从0开始,for循环的条件改一下等等。

 

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 int a[50005];
 5 int l,m,n;
 6 bool ok(int mid)
 7 {
 8     int cnt=0,start=0,i;
 9     for(i = 0; i <= n; i++)
10     {
11         if(a[i]-start < mid) cnt++;
12         else start = a[i];
13     }
14     if(cnt > m) return 0;
15     else return 1;
16 }
17 int main()
18 {
19     int left,right,mid,ans,i;
20     while(~scanf("%d%d%d",&l,&n,&m))
21     {
22         for(i = 0; i < n; i++)
23             scanf("%d",&a[i]);
24         a[n] = l;
25         sort(a,a+n+1);
26         left = 0;
27         right = l;
28         while(left <= right)
29         {
30             mid = (left+right)>>1;
31             if(ok(mid))
32                 ans = mid,
33                 left = mid+1;
34             else right = mid-1;
35         }
36         printf("%d\n",ans);
37     }
38     return 0;
39 }

今天很不好意思,又玩了,不过幸而最后还是刷了一题。