jzoj P1026【GDOI2005】积木分发

来源:互联网 发布:管家婆软件的优缺点 编辑:程序博客网 时间:2024/05/29 02:56

题目大意:
歌手The Pancakes有s块积木,每一个小朋友有a块积木,还要b块才能砌好图形。如果她的积木能帮n个小朋友全部砌完图形,就可以与所有小朋友合影,并且她可以把积木给一个小朋友,然后等该小朋友砌完后就可以收回所发的积木和该小朋友原先手里的积木。能跟所有小朋友合影就输出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.
1 0
原创粉丝点击