码迷,mamicode.com
首页 > 编程语言 > 详细

贪心算法练习(一)

时间:2016-02-04 18:46:20      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:

贪心算法_删数问题

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

分析:基于贪心法,找到一个重量最大的人,让它尽可能与重量大的人同乘一船。如此循环直至所有人都分配完毕即可统计出所需要的独木舟数。

技术分享
 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.
参考程序

COGS这题排行榜上前两名是很快的P党,可以学习下处理方法。

贪心算法_拦截导弹

AYYZOJ p1424

 

贪心算法练习(一)

标签:

原文地址:http://www.cnblogs.com/vacation/p/5181859.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!