您的位置:首页 > 编程语言 > C语言/C++

July 15th 模拟赛C T3 最小最大和 Solution

2016-07-15 17:40 417 查看
空降题目处

点我点我点我

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在数列A,B中出现的次数.

有指针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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Pascal C++ JZOJ