很久之前做的很水的二分答案。
Aggressive cows (usaco 2006December sliver)
var
n,c,ans,i,min,max:longint;
x,d:array[0..100001] of longint;
procedure qsort(head,tail:longint);
var
temp,i,j,mid:longint;
begin
if head>=tail then exit;
i:=head-1;
j:=tail+1;
mid:=x[(head+tail) div 2];
while i<j do
begin
repeat inc(i) until x[i]>=mid;
repeat dec(j) until x[j]<=mid;
if i<j then
begin
temp:=x[i];
x[i]:=x[j];
x[j]:=temp;
end;
end;
qsort(head,j);
qsort(j+1,tail);
end;
function check(mid:longint):boolean;
var
a:array[0..100000] of longint;
i,j:longint;
begin
j:=1;
for i:=1 to 100000 do a[i]:=0;
// fillchar(a,sizeof(a),0);
for i:=1 to n-1 do
if a[j]<mid then
begin
a[j]:=a[j]+d[i];
if a[j]>=mid then inc(j);
end
else
begin
inc(j);
a[j]:=a[j]+d[i];
end;
if j>c-1 then
exit(true);
exit(false);
end;
procedure work(head,tail:longint);
var
mid:longint;
begin
if head=tail then
begin
if check(head) then
if mid>ans then ans:=mid;
exit;
end;
mid:=(head+tail) div 2;
if check(mid) then
begin
if mid>ans then ans:=mid;
if mid+1<=tail then
work(mid+1,tail);
end
else
work(head,mid);
end;
begin
read(n,c);
for i:=1 to n do
read(x[i]);
qsort(1,n);
min:=maxlongint;
for i:=1 to n-1 do
begin
d[i]:=x[i+1]-x[i];
if d[i]<min then
min:=d[i];
end;
max:=(x[n]-x[1]) div (c-1);
work(min,max);
writeln(ans);
end.
这是 我做的第一道二分答案的题 二分过程(work) 写的不是很好 ...
首先是 找出max来 然后程序里min 不太对 其实只要找到一个可能的解赋值给min,然后work(min,max) 就OK了 最后注意每次调用函数前 把J 赋初值。(我就w在这了...)。
Monthly Expense(usaco2006December sliver)
var
ans,m,n,i,max,min:longint;
a:array[1..100000] of longint;
function check(x:longint):boolean;
var
i,s,q:longint;
begin
s:=1;
q:=0;
for i:=1 to n do
if q+a[i]<=x then
q:=q+a[i]
else
begin
q:=a[i];
inc(s);
end;
if s<=m then
exit(true);
exit(false);
end;
procedure work(head,tail:longint);
var
mid:longint;
begin
if head>tail then
exit;
mid:=(head+tail) div 2;
if check(mid) then
begin
ans:=mid;
work(head,mid-1);
end
else
work(mid+1,tail);
end;
begin
read(n,m);
for i:=1 to n do
begin
read(a[i]);
if min<a[i] then
min:=a[i];
end;
for i:=1 to n-m+1 do
max:=max+a[i];
for i:=3 to n do
if max<a[i] then
max:=a[i];
work(min,max);
writeln(ans);
end.
比上一个 还简单 不解释..
River Hopscotch(usaco 2006 december sliver)
var
a,d:array[1..60000] of longint;
n,m,l,i,max,min,ans:longint;
procedure qsort(head,tail:longint);
var
mid,temp,i,j:longint;
begin
if head>=tail then
exit;
i:=head-1;
j:=tail+1;
mid:=a[(head+tail) div 2];
while i<j do
begin
repeat inc(i) until a[i]>=mid;
repeat dec(j) until a[j]<=mid;
if i<j then
begin
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
end;
end;
qsort(head,j);
qsort(j+1,tail);
end;
function check(x:longint):boolean;
var
q,i,s:longint;
begin
q:=0;
s:=0;
for i:=1 to n+1 do
begin
if q<x then
q:=q+d[i]
else
begin
q:=d[i];
inc(s);
end;
end;
if q>=x then
inc(s);
if n+1-s>m then
exit(false);
exit(true);
end;
procedure work(head,tail:longint);
var
mid:longint;
begin
if head>tail then
exit;
mid:=(head+tail) div 2;
if check(mid) then
begin
ans:=mid;
work(mid+1,tail);
end
else
work(head,mid-1);
end;
begin
read(l,n,m);
a[1]:=0;
a[n+2]:=l;
for i:=2 to n+1 do
read(a[i]);
qsort(2,n+1);
max:=l-1;
min:=maxlongint;
for i:=1 to n+1 do
begin
d[i]:=a[i+1]-a[i];
if min>d[i] then
min:=d[i];
end;
work(min,max);
writeln(ans);
end.
同第一个.