原题链接

贪心策略

先对田忌、齐王的马按照速度分别排序。
对排序后的两组马的速度,按如下规则比较:

一、当前田忌最慢的马比齐王最慢的马要快,因为田忌任何马都能赢齐王的这匹最慢的马,就拿自己最慢的马来和齐王比,赢一局且实力损失最小。

二、当前田忌最慢的马比齐王最慢的马要慢,因为田忌最慢的马一定会输齐王任何的马,就拿这匹马和齐王最快的马比,输一局且消耗的齐王实力最大。

三、当前田忌最快的马比齐王最快的马要慢,因为田忌任何马都会输给齐王的这匹最快的马,就拿自己最慢的马来和齐王比,输一局且实力损失最小。

四、当前田忌最快的马比齐王最快的马要快,因为田忌最快的马和齐王的任何马比都会赢,就那这匹马和齐王最快的马比,赢一局且消耗的齐王实力最大。

一二和三四的比较顺序无所谓

五、头尾都相等时,用田忌最慢的马消耗齐王最快的马,出现两种情况:
- 1.齐王最快的马比田忌最慢的马快,输一局。
- 2.齐王最快的马与田忌最慢的马相等,平一局,此时所有马的速度都相等。

代码[c++]

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int HOUSEN = 1005;
int main()
{
int n;
while(scanf("%d",&n)&&n!=0)
{
int tian[HOUSEN],king[HOUSEN];
for(int i=0; i<n; i++)
scanf("%d",tian+i);
for(int i=0; i<n; i++)
scanf("%d",king+i);
sort(tian,tian+n);
sort(king,king+n);
int tleft=0,tright=n-1;
int kleft=0,kright=n-1;
int win=0,lost=0;
while(tleft<=tright)
{
if(tian[tleft]>king[kleft])
{
win++;
tleft++;
kleft++;
}
else if(tian[tleft]<king[kleft])
{
lost++;
tleft++;
kright--;
}
else if(tian[tright]<king[kright])
{
lost++;
tleft++;
kright--;
}
else if(tian[tright]>king[kright])
{
win++;
tright--;
kright--;
}
else
{
if(tian[tleft]<king[kright])lost++;
tleft++;
kright--;
}
}
printf("%d\n",200*(win-lost));
}
return 0;
}
05-11 13:34