您的位置:首页 > 其它

jzoj P1026【GDOI2005】积木分发

2017-04-02 10:38 183 查看
题目大意:

歌手The Pancakes有s块积木,每一个小朋友有a块积木,还要b块才能砌好图形。如果她的积木能帮n个小朋友全部砌完图形,就可以与所有小朋友合影,并且她可以把积木给一个小朋友,然后等该小朋友砌完
4000
后就可以收回所发的积木和该小朋友原先手里的积木。能跟所有小朋友合影就输出YES,不然输出NO。

(1<=s,n<=10000),(1<=a,b<=10^9)

题解:

排序+模拟+贪心:

1.对于每一个b我们可以很容易发现贪心策略,每一次找需要积木最少的给予,就可以保证最优解,所以以b为关键字排序。

2.模拟做过去,如果当前The Pancakes的积木可以帮助需要积木数第k小的小朋友砌完即>b[k]就累加a[k],不然如果第k小都做不了,第k+1小自然做不了就退出。

3.如果能一直做到结束就代表可以帮助全部砌完,输出YES,不然输出NO。

时间复杂度:O(N)

var
a,b:array [0..10001] of longint;
i,n:longint;
m:int64;

procedure qsort(l,r:longint);
var
i,j,mid:longint;
begin
if l>=r then exit;
i:=l; j:=r;
mid:=b[(l+r) div 2];
repeat
while b[i]<mid do inc(i);
while b[j]>mid do dec(j);
if i<=j
then begin
a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];
inc(i); dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;

begin
readln(n,m);
while (n<>0) or (m<>0) do
begin
for i:=1 to n do readln(a[i],b[i]);
qsort(1,n);
i:=0;
while (m>=b[i+1]) and (i<n) do
begin
inc(i);
m:=m+a[i];
end;
if i=n then writeln('YES')
else writeln('NO');
readln(n,m);
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: