最小最大和

来源:互联网 发布:淘宝达人精品帖子 编辑:程序博客网 时间:2024/05/28 05:16


 Alice和Bob在玩一个游戏,每一轮Bob都会给Alice两个整数A和B(1<=A,B<=100),Alice每一轮必须把目前所有的A序列和B序列中的数一一配对,每个数必须用且只使用一次,要求最大和最小。

Input

  第一行一个整数n表示回合数,接下来N行每行包含两个整数A和B(0<=A,B<=100)表示Bob这一轮给的两个数。

Output

  输出N行,每行输出最小的最大和。


SampleInput

输入1:

3

2 8

3 1

1 4



输入2:

3

1 1

2 2

3 3

SampleOutput

输出1:

10

10

9



输出2:

2

3

4

DataConstraint

Hint

【样例解释】
  样例1中,第一轮的A序列为{2},B序列为{8},只能是(2,8),答案为10;
  第二轮A序列为{2,3},B序列{8,1},可以采用配对(2,8),(1,3),这样的配对最大的和是10,是最小的配对方案;
  第三轮A序列为{2,3,1},B序列为{8,1,4}可以采用配对(2,1),(3,4),(1,8),最大的和为9,没有比这更小的配对方案。
【数据范围】
  50%的数据N<=200

 

分析:一开始我们贪心地想到把A从大到小拍,再从小到大排序,取一项的最大值。但是我看到(1<=N<=100000),就蒙了。我又看到(1<=A,B<=100),我就决定用桶排序(多用于数据多范围小的数据排序)。如果有相同的,我们可以当做一个算。例如:

A=(1,2,2,2,3)

B=(4,1,1,1,1)

相同的1和2可以一次计算。

 

var

 g,h,g1,h1:Array [0..111] of longint;

 ans,max,n,x,y,j,k,i:longint;

 

begin

 readln(n);

 for i:=1 to n do

  begin

   readln(x,y);

   inc(g[x]);

   inc(h[y]);

   j:=1; k:=100;

   ans:=0; max:=0;

   g1:=g;

   h1:=h;

   while 1=1 do

    begin

     while (g1[j]=0) and (j<=100) do inc(j);

     if j>=100 then break;

     while (h1[k]=0) and (k>0) do dec(k);

     if k<=0 then break;

     if g1[j]>h1[k] then

      begin

       max:=j+k;

       if max>ans then ans:=max;

       g1[j]:=g1[j]-h1[k];

       dec(k);

      end

     else

      begin

     if g1[j]=h1[k] then

      begin

       max:=j+k;

       if max>ans then ans:=max;

       inc(j); dec(k);

      end

      else

      begin

     if g1[j]<h1[k] then

      begin

       max:=j+k;

       if max>ans then ans:=max;

       h1[k]:=h1[k]-g1[j];

       inc(j);

      end;

     end;

    end;

    end;

   writeln(ans);

  end;

end.

 

0 0
原创粉丝点击