数轴上有n个点,现在有c个点,放在n个点中的c个点中,让c个点中两点间最小距离最大。
这个最大最小问题就真是二分答案了,然后贪心判定即可。
加了一个pascal自身优化{$inline on}把140+ms拉到了90+ms。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 { $inline on} 2 program pku2456(input,output); 3 var 4 x : array[0..100010] of longint; 5 n,c : longint; 6 answer : longint; 7 procedure init; inline; 8 var 9 i : longint; 10 begin 11 readln(n,c); 12 for i:=1 to n do 13 readln(x[i]); 14 end; { init } 15 procedure swap(var aa,bb :longint ); inline; 16 var 17 tt : longint; 18 begin 19 tt:=aa; 20 aa:=bb; 21 bb:=tt; 22 end; { swap } 23 procedure sort(p,q : longint); inline; 24 var 25 i,j,m : longint; 26 begin 27 i:=p; 28 j:=q; 29 m:=x[(i+j)>>1]; 30 repeat 31 while x[i]m do 34 dec(j); 35 if i<=j then 36 begin 37 swap(x[i],x[j]); 38 inc(i); 39 dec(j); 40 end; 41 until i>j; 42 if i p then sort(p,j); 44 end; { sort } 45 function check(limit : longint ):boolean; inline; 46 var 47 sum : longint; 48 i,now : longint; 49 begin 50 now:=1; 51 sum:=1; 52 for i:=1 to n do 53 begin 54 if x[i]-x[now]>=limit then 55 begin 56 now:=i; 57 inc(sum); 58 end; 59 if sum>=c then 60 exit(true); 61 end; 62 exit(false); 63 end; { check } 64 procedure dichotomy; inline; 65 var 66 l,r,mid : longint; 67 begin 68 l:=1; 69 r:=x[n]; 70 while l+1>1; 73 if check(mid) then 74 l:=mid 75 else 76 r:=mid; 77 end; 78 answer:=l; 79 end; { dichotomy } 80 procedure print; inline; 81 begin 82 writeln(answer); 83 end; { print } 84 begin 85 init; 86 sort(1,n); 87 dichotomy; 88 print; 89 end.