pku2456 Aggressive cows
数轴上有n个点,现在有c个点,放在n个点中的c个点中,让c个点中两点间最小距离最大。
这个最大最小问题就真是二分答案了,然后贪心判定即可。
加了一个pascal自身优化{$inline on}把140+ms拉到了90+ms。
View Code
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
32 inc(i);
33 while x[j]>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<q then sort(i,q);
43 if j>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<r do
71 begin
72 mid:=(l+r)>>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.