http://acm.nyist.net/JudgeOnline/problem.php?pid=364
这是一道经典的贪心算法的题目
主要的思想有:
1.当田忌最慢的马比齐王最慢的马快,赢一场先。因为始终要赢齐王最慢的马,不如用最没用的马来赢它。
2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场。因为田忌最慢的马始终要输的,不如用它来消耗齐王最有用的马。
3.当田忌最慢的和齐王最慢的马慢相等时,分4和5讨论。
4.当田忌最快的马比齐王最快的马快时,赢一场先。因为最快的马的用途就是来赢别人快的马,别人慢的马什么马都能赢。
5.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场,因为反正要输一场,不如拿最没用的马输。
6.当田忌最快的马和齐王最快的马相等时,贪心方法是,拿最慢的马来和齐王最快的马比.
应该是很好理解的吧,因此证明就.........
#include<stdio.h>
#include<algorithm>
int main()
{
int n,m,i,j;
int tian[1001],king[1001];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d",&tian[i]);
for(i=0;i<n;i++)
scanf("%d",&king[i]);
std::sort(tian,tian+n);
std::sort(king,king+n);
int win=0,lose=0;
int m=n-1;
n=n-1;
i=0;j=0;
while(i<=n)
{
if(tian[i]<king[j])//田忌最慢比国王最慢还慢,就浪费国王的快马。。嘿嘿
{
i++;
m--;
lose++;
}
else if(tian[i]>king[j])//田忌最慢比国王最慢还快,不用考虑,赢他呀
{
win++;
i++;
j++;
}
else //田忌最慢与国王最慢相等,再考虑最快的之间比较,来判断怎么调用最慢的
{
if(tian[n]>king[m]) //田忌最快的比国王快,国王弱爆了,赢他。。
{ win++ ; n--; m--;}
else
{
if(tian[i]<king[m]) //可能田忌最慢的比和国王最快的一样,因此此处才加这一句
lose++;
i++;
m--;
}
}
}
printf("%d\n",200*(win-lose));
}
return 0;
}