SDNU1026 田忌赛马续

田忌赛马小故事:

齐国使者到大梁来,孙膑以刑徒的身份秘密拜见,用言辞打动齐国使者。齐国使者觉得此人不同凡响,就偷偷地用车把他载回齐国。齐国将军田忌赏识他并像对待客人一样礼待他。田忌经常与齐国诸公子赛马,设重金赌注。孙膑发现他们的马脚力都差不多,可分为上、中、下三等。于是孙膑对田忌说:“您只管下大赌注,我能让您取胜。”
田忌相信并答应了他,与齐王和诸公子用千金来赌胜。比赛即将开始,孙膑说:“现在用您的下等马对付他们的上等马,拿您的上等马对付他们的中等马,拿您的中等马对付他们的下等马。”三场比赛完后,田忌一场不胜而两场胜,最终赢得齐王的千金赌注。于是田忌把孙膑推荐给齐威王。威王向他请教兵法后,就把他当作老师。

题目:

自从齐王和诸公上次被田忌赢了许多的钱而不服,要求再比一次,为了不使田忌能向上一次一样赢得比赛,就规定这次赛马是N对N,就是齐王选出N匹马,田忌必须也出相应的N匹马进行比赛,田忌为了赢取更多的钱,便向孙膑请教赛马的胜负。

输入:

第一行有一个整数N(0<N<10000), 紧跟N行,每行一个整数,田忌的每匹马跑完全程需要的时间t(0<t<20000) 再紧跟N行,每行一个整数,齐王的每匹马跑完全程需要的时间t(0<t<20000) 

输出:

如果田忌能赢则输出“WIN”
如果田忌能输则输出“LOSE”
如果比赛平局则输出“DRAW”

思路:由题目我们很容易想到会将田忌与齐工的马进行排序(注意耗时越长越弱)。这样的目的是按照孙膑的思路去分清上中下马,因为太多了,我们可以认为排完序的马为强弱马。但是我们在进行分类讨论的过程中,需要注意一个问题,我能不能只按照强马的强弱去比较?实际上是不能的

举个例子: 每人假设有6匹马

田忌:8 7 6 5 2 1

齐公:9 8 5 4 3 2

 结果会出现这两种情况,原因就是,如果只看强马比较,我们会忽略掉弱马的作用!!

和原赛马不同,由于原赛马只有3只马,所以分为了下中上三种马,从而使得容易分辨区间。其实他想告诉我们的是,每只马在自己的区间内,也是有自己的作用的,就算是弱马,你也可以干爆别的马从而获得积分!(蒟蒻泪目

因此,我们可以结束这题了

#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define PII pair<int, int>
#define PLL pair<ll, ll>

const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double PI = acos(-1.0);
const double eps = 1e-8;
int a[N],b[N];
bool cmp(int x,int y) 
{
    return x > y;
}
void solve()
{
    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 win = 0;
    int a1 = 0, b1 = 0;
    int a2 = n - 1, b2 = n - 1;
    for(int i = 0; i < n; i ++)
    {
        if(a[a2] < b[b2]) //如果田忌强🐎打的过齐公,田忌就赢了一分
            ++ win;
            -- a2;
            -- b2;
        }
        else if(a[a1] < b[b1])//如果田忌弱🐎打的过齐公,田忌就赢了一分
        {
            ++ win;
            ++ a1;
            ++ b1;
        }
        else if(a[a2] > b[b2])//如果田忌强🐎打不过齐公,拿田忌最弱的🐎换齐公
        {
            -- win;
            --b2;
            ++a1;
        }
        else if(a[a2] == b[b2] && a[a1] > b[b2])//两个人的强🐎一样nb,并且田忌的弱马更弱,拿田忌最弱的🐎换齐公
        {
            --win;
            --b2;
            ++a1;  
        }
    }
   // cout<<win<<endl;
    if(win == 0) puts("DRAW");
    else if(win > 0) puts("WIN");
    else if(win < 0)puts("LOSE");
}
int main()
{
    solve();

   
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值