Tian Ji -- The Horse Racing |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 6786 Accepted Submission(s): 1644 |
Problem Description Here is a famous story in Chinese history.
|
Input The input consists of up to 50 test cases. Each case starts with a positive integer n (n <= 1000) on the first line, which is the number of horses on each side. The next n integers on the second line are the speeds of Tian’s horses. Then the next n integers on the third line are the speeds of the king’s horses. The input ends with a line that has a single 0 after the last test case.
|
Output For each input case, output a line containing a single number, which is the maximum money Tian Ji will get, in silver dollars.
|
Sample Input
|
Sample Output
|
Source 2004 Asia Regional Shanghai |
1.当田忌最慢的马比齐王最慢的马快,赢一场先。因为始终要赢齐王最慢的马,不如用最没用的马来赢它。
2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场。因为田忌最慢的马始终要输的,不如用它来消耗齐王最有用的马。
3.当田忌最慢的和齐王最慢的马慢相等时,分4和5讨论。
4.当田忌最快的马比齐王最快的马快时,赢一场先。因为最快的马的用途就是来赢别人快的马,别人慢的马什么马都能赢。
5.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场,因为反正要输一场,不如拿最没用的马输。
6.当田忌最快的马和齐王最快的马相等时,这就要展开讨论了,贪心方法是,拿最慢的马来和齐王最快的马比.
这一题基本网上的题解很详细,但几乎没有分析为什么下面思路错误。
1、田忌的快马比齐王的快,直接比掉。
2、若快马没有快,就拿田忌最慢的和齐王最快的比较。
给一组测试数据
3
99 99 2
99 98 1
可以看出用第二种贪心:
King 99-> tianji 2
King 98-> tianji 99
King 1->tianji 99
赢200
但用第一种贪心会得到400
因为第二种只考虑让tianji快马祈祷更大作用,没考虑到King的很慢马起到消耗tianji次慢马的结果。导致不是最优解。
可以根据这组数据和上面网上的解析仔细思考下,很容易得到贪心最优解。(当然第一种贪心先比快马然后比慢马也可以的)
AC代码
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1010];
int b[1010];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
}
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+n,cmp);
int sum=0;
int i=1,j=1,io=n,jo=n,flag=0;//flag为参与比赛马的对数,i,io,j,jo分别为tianji king的快慢马
while(1)
{
if(flag==n)break;
if(a[i]>b[j])
{
sum+=200;
i++;j++;
flag++;
continue;
}
if(a[i]<=b[j])
{
if(a[io]>b[jo])
{
sum+=200;
io--;jo--;flag++;
continue;
}
if(a[io]<=b[jo])
{
if(a[io]<b[j])
{
sum-=200;
flag++;
j++;io--;
continue;
}
if(a[io]==b[j])
{
j++;io--;
flag++;
continue;
}
}
}
}
printf("%d\n",sum);
}
return 0;
}