栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

P1797 求解田忌赛马问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

#include 
#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());
    sort(b + 1,b + n + 1,greater());
    // 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;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931390.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号