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行,每行输出最小的最大和。
Solution
None%
堆排,反正我没试过。
往下拉
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
好吧,正解来了。
100%
Ax,Bx
为统排,计算数
x
在数列
有指针
P,Q
分别从
A,B
头,尾开始.
……
详见BIAO
Program
C++
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int ans,n,x,y,t,a[102],b[102],c[102],d[102];
int main()
{
scanf("%d",&n);
for (int k=1;k<=n;k++)
{
scanf("%d%d",&x,&y);
c[x]++;
d[y]++;
memcpy(a,c,sizeof(c));
memcpy(b,d,sizeof(d));
ans=x=0;
y=101;
while ((x<=100)&&(y>=1))
{
while ((a[x]==0)&&(x<=100))
x++;
if (x>100)
break;
while ((b[y]==0)&&(y>=1))
y--;
if (y<1)
break;
if (a[x]<b[y])
{
ans=max(ans,x+y);
b[y]-=a[x];
a[x]=0;
}
else
{
ans=max(ans,x+y);
a[x]-=b[y];
b[y]=0;
}
}
printf("%d\n",ans);
}
}
Pascal
uses
math;
var
ans,n,x,y,t,k:longint;
c,d,a,b:array [0..101] of longint;
begin
readln(n);
for k:=1 to n do
begin
readln(x,y);
inc(c[x]);
inc(d[y]);
a:=c;
b:=d;
x:=0;
y:=101;
ans:=0;
while (x<=100) and (y>=1) do
begin
while (a[x]=0) and (x<=100) do
inc(x);
if x>100 then
break;
while (b[y]=0) and (y>=1) do
dec(y);
if y<1 then
break;
if a[x]<b[y] then
begin
ans:=max(ans,x+y);
b[y]:=b[y]-a[x];
a[x]:=0;
end else
begin
ans:=max(ans,x+y);
a[x]:=a[x]-b[y];
b[y]:=0;
end;
end;
writeln(ans);
end;
end.