P1797 求解田忌赛马问题

在战国时期的历史故事基础上,田忌面对与齐威王的赛马挑战,利用算法策略优化马匹出场顺序,以求在有限数量的马匹中获得最多银币。输入包括双方马匹数量及速度值,目标是找到最佳排列,使田忌赢得最多的比赛,输出为田忌可能获得的最大银币数。

问题描述

两千多年前的战国时期,齐威王与大将田忌赛马。双方约定每人各出 300 匹马,并且在上、中、下 3 个等级中各选一匹进行比赛,由于齐威王每个等级的马都比田忌的马略强,比赛的结果可想而知。现在双方各 n 匹马,依次派出一匹马进行比赛,每一轮获胜的一方将从输的一方得到 200 银币,平局则不用出钱,田忌已知所有马的速度值并可以安排出场顺序,问他如何安排比赛获得的银币最多?

Tip: 本题为单组输入

输入描述

第 1 行,一个正整数 n (n \le 100000)n(n≤100000),表示马的数量; 后两行分别是 nn 个整数,表示田忌和齐威王的马的速度值。

输出描述

每个测试用例输出一行,表示田忌获得的最多银币数。

样例输入

Copy to Clipboard
3 92 83 71 95 87 74 

样例输出

Copy to Clipboard
200

/*
 * @Description: To iterate is human, to recurse divine.
 * @Autor: Recursion
 * @Date: 2022-05-26 14:09:13
 * @LastEditTime: 2022-05-26 14:55:03
 */
#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e9 + 10;
const int N = 2e+7;
int a[N];
int b[N];
int n;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i = 1;i <= n;i ++){
        cin >> a[i];
    }
    for(int i = 1;i <= n;i ++){
        cin >> b[i];
    }
    sort(a + 1,a + n + 1,greater<int>());
    sort(b + 1,b + n + 1,greater<int>());
    // for(int i = 1;i <= n;i ++ )
    //     cout << a[i] << endl;

    int ans=0;
    for(int i=1,j=1,ii=n,jj=n;i<=ii;){
        if(a[i] > b[j]){
            i++;
            j++;
            ans += 200;
        }
        else if(a[i] < b[j]){
            ii--;
            j++;
            ans -= 200;
        }
        else{
            if(a[ii] > b[jj]){
                ii--;
                jj--;
                ans+=200;
            }
            else{
                if(a[ii] < b[j])
                    ans -= 200;
                j++;
                ii--;
            }
        }
    }

    cout << ans << endl;

    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值