贪心算法练习(一)
贪心算法_删数问题
AYYZOJ p1420
删数问题,算法在上一篇中讲得很详细,注意最后输出数前的零要去掉。
1 var n:string; 2 s,i:integer; 3 begin 4 readln(n); 5 readln(s); 6 while s>0 do 7 begin 8 i:=1; 9 while(i<length(n))and(n[i]<=n[i+1])do inc(i); 10 delete(n,i,1); 11 dec(s); 12 end; 13 while (length(n)>1)and(n[1]='0')do delete(n,1,1); 14 writeln(n); 15 end.
贪心算法_排队接水
AYYZOJ p1421
1 program p1421; 2 var 3 n,r,i,k,ans:longint; 4 a,b:array[1..1000] of longint; 5 procedure sort(l,r:longint); 6 var 7 i,j,mid,t:longint; 8 begin 9 i:=l; 10 j:=r; 11 mid:=a[(i+j)div 2]; 12 repeat 13 while a[i]<mid do inc(i); 14 while a[j]>mid do dec(j); 15 if i<=j then 16 begin 17 t:=a[i]; a[i]:=a[j]; a[j]:=t; 18 inc(i); 19 dec(j); 20 end; 21 until i>j; 22 if l<j then sort(l,j); 23 if i<r then sort(i,r); 24 end; 25 begin 26 readln(n,r); 27 for i:=1 to n do read(a[i]); 28 sort(1,n); //对打水时间进行排序 29 for i:=1 to n do //注意总时间是所有人从站到队里开始到接完水离开的时间的总和; 30 begin 31 inc(k); 32 if k=r+1 then k:=1; 33 b[k]:=b[k]+a[i]; 34 ans:=ans+b[k]; 35 end; 36 writeln(ans); 37 end.
贪心算法_独 木 舟
AYYZOJ p1423
COGS p225
分析:基于贪心法,找到一个重量最大的人,让它尽可能与重量大的人同乘一船。如此循环直至所有人都分配完毕即可统计出所需要的独木舟数。
COGS这题排行榜上前两名是很快的P党,可以学习下处理方法。
1 var w,n,sum:int64; //注意两个重量相加有可能超过长整型 2 i,j:longint; 3 a:array[1..30000] of longint; 4 procedure qsort(l,r:longint); 5 var i,j,mid,k:longint; 6 begin 7 i:=l; 8 j:=r; 9 mid:=a[(l+r) div 2]; 10 repeat 11 while a[i]>mid do inc(i); 12 while a[j]<mid do dec(j); 13 if i<=j then 14 begin 15 k:=a[i]; 16 a[i]:=a[j]; 17 a[j]:=k; 18 inc(i); 19 dec(j); 20 end; 21 until i>j; 22 if i<r then qsort(i,r); 23 if l<j then qsort(l,j); 24 end; 25 begin 26 readln(w); 27 readln(n); 28 for i:=1 to n do readln(a[i]); 29 qsort(1,n); //按重量从大到小排序 30 i:=1; j:=n; 31 sum:=0; 32 while i<=j do //从重量最大的人找起 33 begin 34 while (a[i]+a[j]>w) do begin sum:=sum+1; i:=i+1; end; //与重量最小还不能同船,只能独占一个船了 35 if (a[i]+a[j]<=w)and(i<=n) then begin i:=i+1; j:=j-1; sum:=sum+1; end; 36 end; 37 writeln(sum); 38 end.
贪心算法_拦截导弹
AYYZOJ p1424
分析:详见课件的例8
1 var 2 f:array[0..10000] of longint; 3 a:array[0..10000] of longint; 4 i,j,l,n,sum:longint; 5 begin 6 readln(n); 7 for i:=1 to n do read(f[i]); 8 sum:=0; 9 a[0]:=maxlongint; 10 for i:=1 to n do 11 begin 12 l:=0; 13 for j:=1 to sum do 14 if (a[j]>=f[i])and(a[j]<a[l]) then l:=j; 15 if l=0 then 16 begin 17 sum:=sum+1; 18 a[sum]:=f[i]; 19 end else 20 a[l]:=f[i]; 21 end; 22 writeln(sum); 23 end.
1 program p1424; 2 var 3 k,i,n,p,j:longint; 4 a,l:array[1..1000]of longint; 5 begin 6 readln(n); 7 for i:=1 to n do read(a[i]); 8 k:=1; l[1]:=a[1]; 9 for i:=2 to n do 10 begin 11 p:=0; 12 for j:=1 to k do 13 if (l[j]>=a[i])and((p=0)or(l[j]<l[p])) then p:=j; 14 if p=0 then begin inc(k); l[k]:=a[i]; end 15 else l[p]:=a[i]; 16 end; 17 writeln(k); 18 end.