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

本文介绍了一种解决游戏配对问题的算法,该问题要求玩家将每轮给出的两个整数序列进行最优配对,以求得每轮的最小最大和。通过遍历序列并比较次数来实现这一目标。

空降题目处
点我点我点我

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值