田忌赛马

经过了从中午12:30到晚上7点40的时间终于ac了这道题,提醒一下自己,写了篇博客
首先我把king[](国王)和TJ(田忌)的马都从大到小排序,我用sum记录胜利的场数;
然后把这个比赛分为3种情况
1,king < TJ
这种情况直接加上一场 sum++;
原因不解释。
2, king > TJ
这种情况就要用TJ的最慢马当炮灰,sum--;
为什么呢?
因为我怎么都是输一场,这样我可以保留我的最快马和提高我的最慢马,
不会比那种情况更坏。
3,King == TJ
这种情况是最复杂的,我们不能直接把他们平掉比如这组数据
10 8 7
11 10 9
情况自己考虑;
我同样把它分为3种情况。
1,首先就是从最慢的马开始,如果TJ的最慢马>king 的最慢马那么直接sum++;
原因不解释;
2,TJ的最慢马< king 的最慢马
这时候我就让 TJ的最慢马与king的最快马相比,反正都是输,为什么不给对方最快的马相比
这样我的最快马肯定就能胜一场,
3,TJ == King
这时候我们就要想了我的最慢马和最快马都相等了我是不是直接平掉呢,给你
一组数据就知道了
5 1 1
5 3 1
是的,不应该平掉,那么现在就要再分为两种情况
1,TJ的最慢马 == king的最快马
这时候就直接平调就行
2 TJ < King
这时候就要输一场把我的最慢马给他的最快马比一下,这种情况最坏是平掉的那种情况
不会出现 TJ<King 
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int TJ[10008],King[10008];
bool cmp(int a,int b)
{
    return a>b;
}
int n,m;
void solve()
{
    for(int i=n-1;i>=1;i--)
    {
            TJ[i] = TJ[i-1] ;
    }
}
int main()
{
    while(cin>>n)
    {
        for(int i=0;i<n;i++)cin>>TJ[i];
        for(int i=0;i<n;i++)cin>>King[i];
        sort(King,King+n,cmp);
        sort(TJ,TJ+n,cmp);
        int sum = 0;
        for(int i=0;i<n;i++)
        {
            if(King[i] == TJ[i])
            {
                    if(TJ[n-1]>King[n-1])
                    {
                        sum++;
                        n--;
                        i--;
                    }
                    else
                    if(TJ[n-1]==King[n-1])
                    {

                        if(TJ[n-1]==King[i]){i--;n--;continue;};// 好好体会这个
                        solve();
                        sum--;
                    }
                    else
                    {
                        solve();
                        sum--;
                    }
            }
            else
            if(King[i] < TJ[i])sum++;
            else
             {
               solve();sum--;
             }
        }
    cout<<sum*200<<endl;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值