奶牛晒衣服 (Standard IO)

题意/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.



原文地址:https://www.cnblogs.com/zyx-crying/p/9319641.html