bzoj1816二分答案 扑克牌

bzoj1816二分答案 扑克牌
 1 program hehe;

 2 var

 3  n,m,i,j:longint;

 4  c:array[0..50] of longint;

 5 

 6   function min(a,b:longint):longint;

 7   begin

 8    if a>b then exit(b);

 9    exit(a);

10   end;

11 

12   function ok(a:longint):boolean;

13   var

14    f,t:longint;

15   begin

16    t:=min(a,m);

17    for f:=1 to n do

18    begin

19     if c[f]<a then

20     t:=t-a+c[f];

21     if t<0 then exit(false);

22    end;

23    exit(true);

24   end;

25 

26   function ef(l,r:longint):longint;

27   var

28    mid:longint;

29   begin

30    if l=r then exit(l);

31    mid:=(l+r)>>1;

32    if ok(mid+1) then

33    exit(ef(mid+1,r))

34    else exit(ef(l,mid));

35   end;

36 

37 begin

38  readln(n,m);

39  for i:=1 to n do read(c[i]);

40  writeln(ef(1,maxlongint-1));

41 end.
View Code

1816: [Cqoi2010]扑克牌

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1473  Solved: 566
[Submit][Status][Discuss]

Description

你有n种牌,第i种牌的数目为ci。另外有一种特殊的牌:joker,它的数目是m。你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1套牌。比如,当n=3时,一共有4种合法的套牌:{1,2,3}, {J,2,3}, {1,J,3}, {1,2,J}。 给出n, m和ci,你的任务是组成尽量多的套牌。每张牌最多只能用在一副套牌里(可以有牌不使用)。

Input

第一行包含两个整数n, m,即牌的种数和joker的个数。第二行包含n个整数ci,即每种牌的张数。

Output

输出仅一个整数,即最多组成的套牌数目。

Sample Input

3 4
1 2 3

Sample Output

3

样例解释
输入数据表明:一共有1个1,2个2,3个3,4个joker。最多可以组成三副套牌:{1,J,3}, {J,2,3}, {J,2,3},joker还剩一个,其余牌全部用完。

数据范围
50%的数据满足:2 < = n < = 5, 0 < = m < = 10^ 6, 0< = ci < = 200
100%的数据满足:2 < = n < = 50, 0 < = m, ci < = 500,000,000。

HINT

 

Source

 
[ Submit][ Status][ Discuss]

 

你可能感兴趣的:(ZOJ)