田忌赛马

来源:互联网 发布:yii2返回json 编辑:程序博客网 时间:2024/04/28 10:45
经过了从中午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;    }}