最小值最大化问题,刚开始没思路,还是经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 }
今天很不好意思,又玩了,不过幸而最后还是刷了一题。