问题描述
田忌和齐王各有n匹马,共有2n组数据,分别给出田忌和齐王n匹马的速度。
他们一共要进行n场比赛,若能分出胜负,则输的一方要给赢的一方200银元。若平局,则他们都不用给对方钱。每匹马都只能用一次。现在要你求出一个最佳策略,使田忌获得的钱数最多。并输出这个最大值。
Solution:
先对田忌和齐王的马的速度的数组进行一次从小到大的排序。
step1:我们先比较田忌最快的马和齐王最快的马的速度,若田忌获胜,就让这两匹马比赛。
step2:若田忌最快的马没有齐王最快的马的速度快,则用田忌最慢的马和齐王最快的马比赛。
step3:若田忌最快的马没有齐王最快的马的速度相等,则比较他们最慢的马的速度,这又分为两种情况。情况1:田忌最慢的马比齐王最慢的马的速度快,则让它们比赛。情况2:田忌最慢的马比齐王最慢的马的速度慢或者相等,则让田忌最慢的马和齐王最快的马比赛。
代码如下:
#include<iostream>
#include<algorithm>
#define MAX 100
using namespace std;
int n;//两人各有n匹马
int tian[MAX],qi[MAX];
int main(){
cin>>n;
for(int i=0;i<n;i++){//读入数据
cin>>tian[i];
}
for(int i=0;i<n;i++){//读入数据
cin>>qi[i];
}
sort(tian,tian+n);
sort(qi,qi+n);//从小到大排序
int i=0,j=0;//i和j分别表示田忌和齐王最慢的马
int k1=n-1,k2=n-1;//k1和k2分别表示田忌和齐王最快的马
int num=0;//计数已经比赛过的马的数量
int money=0;//田忌获得的钱
while(num<n){
if(tian[k1]>qi[k2]){//若田忌的快马比齐王的快马快
money+=200;
k1--;
k2--;
num++;
continue;
}
if(tian[k1]<qi[k2]){//若田忌的快马没有齐王的快马快
money-=200;
i++;
k2--;
num++;
continue;
}
if(tian[k1]==qi[k2]){//若田忌的快马和齐王快马一样快
if(tian[i]>qi[j]){//若田忌的慢马速度比齐王的慢马速度快,
//则他们的慢马比赛
money+=200;
i++;
j++;
num++;
continue;
}else{//若田忌的慢马速度比齐王的慢马速度慢或者相等
//就让田忌的慢马和齐王最快的马比赛
if(tian[i]<qi[k2]){money-=200;}
i++;
k2--;
num++;
continue;
}
}
}
cout<<money;
return 0;
}