最小最大和_纪中1443_桶优化的暴力

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]then
      begin
        b[k]:=b[k]-a[j];
        dec(j);
      end
      else
        if b[k]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.

转载于:https://www.cnblogs.com/olahiuj/p/5781248.html

你可能感兴趣的:(最小最大和_纪中1443_桶优化的暴力)