题目大意大家一定知道,就是田忌赛马的故事。但是解决的方法却很让我头痛。一开始的时候就不知道如何解决势均力敌的情况。参见这个才弄清楚具体的思想是什么。下面是我自己编写的代码。田忌赛马的贪心算法思想如下:
比较最大值
1.田忌的最大值大于国王的最大值时,田忌赢一场
2.田忌的最大值小于国王的最大值时,使用田忌的最小值来和国王的最大值比较
3.田忌的最大值和国王的最大值相等的时候需要分情况讨论,
(1)如果直接比较就会平。
(2)如果使用田忌的最小值和国王的最大值比较,田忌的最大值肯定比国王的其他值大也是平。此时要讨论,如果田忌的最小值大于国王的最小值,而让田忌的最小值和国王的最大值比较会出现一胜一负的情况,但是直接比较两个最小值时出现一胜一平的情况。所以这种情况应该让最小值相互比较。如果田忌的最小值小于等于国王的最小值,那么就用比较他们两。
但是为了赢得获得更大的赢得可能性,我选择使用第二种分析。
#include<iostream>
#include<algorithm>
using namespace std;
int tian[1005];
int king[1005];
bool cmp_value(int a,int b){
return a<b;
}
int main()
{
int n;
while(scanf("%d",&n)&&n!=0){
for(int i=0;i<n;i++)
scanf("%d",&tian[i]);
sort(tian,tian+n,cmp_value);
for(int i=0;i<n;i++)
scanf("%d",&king[i]);
sort(king,king+n,cmp_value);
int get=0;
int t_high=n-1;
int t_low=0;
int k_high=n-1;
int k_low=0;
while(t_low<=t_high){
if(tian[t_low]>king[k_low])
{
get+=200;
//printf("t=%d k=%d\n",tian[t_low],king[k_low]);
t_low++;
k_low++;
}else if(tian[t_low]<king[k_low])
{
get-=200;
//printf("t=%d k=%d\n",tian[t_low],king[k_high]);
t_low++;
k_high--;
}else{
if(tian[t_high]>king[k_high])
{
get+=200;
//printf("t=%d k=%d\n",tian[t_high],king[k_high]);
t_high--;
k_high--;
}else
{
if(tian[t_low]<king[k_high])
get-=200;
//printf("%d %d\n",tian[t_low],king[k_high]);
t_low++;
k_high--;
}
}
}
printf("%d\n",get);
}
return 0;
}
//两边同时需要改变的时候就使用两边的游标,同时一定要在想清楚的情况下进行编程,否则不要动。