中国古代很有名的田忌赛马问题,题目大意就是这个,原文中出现了一个叫bipartite graph(二分图)的图要注意以下。然后说一下解题思路:分析题目可知,使用贪心算法就可以达到全局最优。下面是贪心解法的代码,值得注意的是第39行的判断
if(tian[lt]<king[hk])
是很有必要的,因为会存在一种特殊情况那就是两方的马都打成平手,此时不需要ans-=200。
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
int count;
int tian[1001],king[1000];
while(scanf("%d",&count)&&count)
{
for(int i=0;i<count;i++)
scanf("%d",&tian[i]);
for(int i=0;i<count;i++)
scanf("%d",&king[i]);
sort(tian,tian+count);
sort(king,king+count);
int lk=0,lt=0,hk=count-1,ht=count-1;
int ans=0;
while(ht>=lt)
{
if(tian[lt]>king[lk])
{
ans+=200;
lt++;
lk++;
}
else if(tian[lt]<king[lk])
{
ans-=200;
lt++;
hk--;
}
else if(tian[lt] == king[lk] && tian[ht]>king[hk])
{
ans+=200;
ht--;
hk--;
}
else if(tian[lt] == king[lk] && tian[ht]<=king[hk])
{
if(tian[lt]<king[hk]) ans-=200;
lt++;
hk--;
}
}
printf("%d\n",ans);
}
return 0;
}