Description
Alice和Bob在玩一个游戏,每一轮Bob都会给Alice两个整数A和B(1<=A,B<=100),Alice每一轮必须把目前所有的A序列和B序列中的数一一配对,每个数必须用且只使用一次,要求最大和最小。
Input
第一行一个整数N(1<=N<=100000),表示比赛的轮数。
接下来N行每行包含两个整数A和B(1<=A,B<=100),表示Bob这一轮给的两个数。
Output
输出N行,每行输出最小的最大和。
Hint
[数据范围]
50%的数据N<=200
分析
看到n<=100000我就怂了,但是听了题解发现果汁水四溢
因为数字的范围很小,所以可以用两个桶分别记录数量,最大数和最小数配对,次大数和次小数配对,找到最大值就好了
代码
var
a,b,c,d:array[1..100]of longint;
n,i,ans,k,j,x,y:longint;
begin
readln(n);
for i:=1 to n do
begin
readln(x,y);
inc(a[x]);
inc(b[y]);
c:=a;
d:=b;
ans:=0;
j:=100;
k:=1;
while (j>0)and(k<101) do
begin
if (a[j]>0)and(b[k]>0) then
if j+k>ans then max:=j+k;
if a[j]<b[k] then
begin
b[k]:=b[k]-a[j];
dec(j);
end
else
if b[k]<a[j] then
begin
a[j]:=a[j]-b[k];
inc(k);
end
else
if b[k]=a[j] then
begin
inc(k);
dec(j);
end;
end;
writeln(ans);
a:=c;
b:=d;
end;
end.