奶牛晒衣服 (Standard IO)

来源:互联网 发布:怎样用淘宝联盟买东西 编辑:程序博客网 时间:2024/04/27 16:36

题意/Description:

       在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝。熊大妈决定给每个宝宝都穿上可爱的婴儿装。于是,为牛宝宝洗晒衣服就成了很不爽的事情。
  圣人王担负起了这个重任。洗完衣服后,你就要弄干衣服。衣服在自然条件下用1的时间可以晒干A点湿度。抠门的熊大妈买了1台烘衣机。使用烘衣机可以让你用1的时间使1件衣服除开自然晒干的A点湿度外,还可烘干B点湿度,但在1的时间内只能对1件衣服使用。
  N件衣服因为种种原因而不一样湿,现在告诉你每件衣服的湿度,要你求出弄干所有衣服的最少时间(湿度为0为干)。


读入/Input

        第一行N,A,B;接下来N行,每行一个数,表示衣服的湿度(1<=湿度,A,B<=500000,1<=N<=500000)。


输出/Output

       一行,最少时间。


题解/solution

       给衣服的湿度排序,用r记录最长衣服干的时间,l记录开始时间,mid为中间时间。然后二分,如果A*mid可以自然干,那往前二分。否则,算一下烘干机是否能烘干,可以往前二分。不可,往后二分。


代码/Code

var  n,aa,bb:longint;  a:array [0..500001] of longint;procedure qsort(l,r:longint);var i,j,m,t:longint;begin  i:=l; j:=r;  m:=a[(l+r) div 2];  repeat    while a[i]>m do inc(i);    while a[j]<m do dec(j);    if i<=j then      begin        t:=a[i]; a[i]:=a[j]; a[j]:=t;        inc(i); dec(j);      end;  until i>j;  if l<j then qsort(l,j);  if i<r then qsort(i,r);end;procedure init;var  i:longint;begin  readln(n,aa,bb);  for i:=1 to n do    readln(a[i]);  qsort(1,n);end;function fd(mid:longint):boolean;var  i,sum,t:longint;begin  sum:=0;  for i:=1 to n do    begin      t:=a[i]-mid*aa;      if t<=0 then exit(true);      sum:=sum+t div bb;      if t mod bb<>0 then sum:=sum+1;      if sum>mid then exit(false);    end;end;procedure main;var  i,l,r,mid:longint;begin  l:=1;  if a[1] mod aa=0 then r:=a[1] div aa                   else r:=a[1] div aa+1;  mid:=(l+r) div 2;  while l<=r do    begin      if fd(mid) then r:=mid-1                 else l:=mid+1;      mid:=(l+r) div 2;    end;  if not fd(mid) then mid:=mid+1;  write(mid);end;begin  init;  main;end.


4 0