很久之前做的很水的二分答案。
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.
同第一个.