田忌赛马解析

题目描述

我国历史上有个著名的故事: 2300年前,齐国的大将军田忌喜欢赛马,他经常和齐王赛马。他和齐王都有三匹马:常规马,上级马,超级马。一共赛三局,每局的胜者可以从负者这里取得 200 银币。每匹马只能用一次。齐王的马好,同等级的马,齐王的总是比田忌的要好一点。于是每次和齐王赛马,田忌总会输 600 银币。

田忌很沮丧,直到他遇到了著名的军师――孙膑。田忌采用了孙膑的计策之后,三场比赛下来,轻松而优雅地赢了齐王 200 银币。这实在是个很简单的计策。由于齐王总是先出最好的马,再出次好的,所以田忌用常规马对齐王的超级马,用自己的超级马对齐王的上级马,用自己的上级马对齐王的常规马,以两胜一负的战绩赢得200 银币。实在很简单。

如果不止三匹马怎么办?现在,就请你设计一个简单的算法解决这个问题。

输入格式

第一行一个整数 n ,表示他们各有几匹马(两人拥有的马的数目相同)。

第二行 n 个整数,每个整数都代表田忌的某匹马的速度值(0≤ 速度值 ≤100)。

第三行 n 个整数,描述齐王的马的速度值。两马相遇,根据速度值的大小就可以知道哪匹马会胜出。如果速度值相同,则和局,谁也不拿钱。

输出格式

仅一行,一个整数,表示田忌最大能得到多少银币。

输入输出样例

输入数据 1

3

92 83 71

95 87 74

Copy

输出数据 1

200

Copy

说明 / 提示

数据范围

对于 20% 的数据,1N65;

对于 40% 的数据,1N250;

对于 100% 的数据,1N2,000

思路:

先把田忌与齐王的马降序排列(sort),在比较田忌与齐王最快的马,田忌的快,sum+=200然后比较田忌与齐王最慢的马,处理方法同上。只有在实在不能获胜的情况下,也就是前面的情况都不成立,才能sum-=200;如果遇到了平局,直接用田忌最慢的马浪费齐王最快的马,因为前面已经判断过田忌最慢的马与齐王最慢的马谁快了,所以不用担心后面浪费掉田忌第二慢的马了。速度一样啥也不干。注意:我们用th,tt,qh,qt分别代表田忌最快的马与最慢的马,还有齐王最快的马与最慢的马。

代码:

#include<bits/stdc++.h>

using namespace std;

int a[2001],b[2001];

bool cmp(int x,int y){

    return x>y;

}

int main(){

    int n;

    cin>>n;

    for(int i=0;i<n;i++){

        cin>>a[i];

    }

    for(int i=0;i<n;i++){

        cin>>b[i];

    }

    sort(a,a+n,cmp);

    sort(b,b+n,cmp);

    int th=0,tt=n-1,qh=0,qt=n-1,sum=0;

    for(int i=0;i<n;i++){

        if(a[th]>b[qh]){

            sum+=200;

            th++;

            qh++;

        }else if(a[tt]>b[qt]){

            sum+=200;

            tt--;

            qt--;

        }else{

            sum-=200;

            tt--;

            qh++;

        }

    }

    cout<<sum;

    return 0;

}

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值