• 贪心算法练习(一)


    贪心算法_删数问题

    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.
    我的程序
  • 相关阅读:
    【Python】 命名空间与LEGB规则
    【Python&数据结构】 抽象数据类型 Python类机制和异常
    【算法】 算法和数据结构绪论
    【网络】 数据链路层&物理层笔记
    svn -- svn图标解析
    svn -- svn数据仓库
    svn -- svn安装与配置
    svn -- svn简介
    mysql -- 远程访问mysql的解决方案
    css3 -- 自动生成序号(不使用JS,可任意排序)
  • 原文地址:https://www.cnblogs.com/vacation/p/5181859.html
Copyright © 2020-2023  润新知