题解 P1650 【田忌赛马】

与古代田忌的应对方法差不多,现在我们任然可以用贪心的思路解答。

1.田忌的马甚至比齐王的马快,那么,直接将两人最快的马进行比赛,达到最优

2.田忌最快的马比齐王最快的马要慢,则与古代田忌的方案相同,用田忌最慢的马消耗掉齐王最快的马

3.齐王最快的马与田忌最快的马速度相当,又可以分成2种情况 程序:

#include <bits/stdc++.h>
using namespace std;
long n,money,x1,x2,y11,y2;
int a[10001],b[10001];
int main(){
    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);//先给各自的马排序
    sort(b,b+n);
    x1=x2=0;//先给各个数值初始化 
    y11=y2=n-1;
    while(x1<=y11){
        if(a[y11]>b[y2]){//如果田忌的最快的马比齐王最快的马还要快,自然相比 
            money+=200;//增加钱 
            y11--;//两边的的马的数量都减少一个 
            y2--;
        }
        else if(a[y11]<b[y2]){//如果田忌的最快的马比齐王最快的马要慢,则用田忌最慢的马来消耗掉齐王最快的马 
            money-=200;//钱要减少 
            x1++;
            y2--;
        }
        else{//如果田忌最快的马与齐王最快的马速度相当
            if(a[x1]>b[x2]){//如果田忌最慢的马比齐王最慢的马要快,则田忌会用他最慢的马与齐王最慢的马比赛 
                money+=200;//钱要增加 
                x1++;
                x2++;
            }
            else{//否则,用田忌最慢的马消耗掉齐王最快的马 
                if(a[x1]<b[y2])
                    money-=200;
                x1++;
                y2--;
            }
        }
    }
    cout<<money;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42875611/article/details/82933914
今日推荐