贪心算法练习(一)

贪心算法_删数问题

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.
我的程序

 

你可能感兴趣的:(贪心算法练习(一))