题意:田忌赛马。每匹马给定一个能力值,赢一场赢200元,输一场输200元,平局钱数不变。问收益最大。
思路(http://blog.csdn.net/zhang20072844/article/details/8126344):贪心策略:1,如果田忌的最快马快于齐王的最快马,则两者比。
(因为若是田忌的别的马很可能就赢不了了,所以两者比)
2,如果田忌的最快马慢于齐王的最快马,则用田忌的最慢马和齐王的最快马比。
(由于所有的马都赢不了齐王的最快马,所以用损失最小的,拿最慢的和他比)
3,若相等,则比较田忌的最慢马和齐王的最慢马
3.1,若田忌最慢马快于齐王最慢马,两者比。
(田忌的最慢马既然能赢一个就赢呗,而且齐王的最慢马肯定也得有个和他比,所以选最小的比他快得。)
3.2,其他,则拿田忌的最慢马和齐王的最快马比。
(反正所有的马都比田忌的最慢马快了,所以这匹马必输(这个地方还是不太明白),选贡献最大的,干掉齐王的最快马)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 1005
int t[N],k[N];
int n;
int cmp(const void* a,const void* b){
return (*(int*)a) - (*(int*)b);
}
int main(){
while(scanf("%d",&n) && n){
int res=0,i,ti,ki,tj,kj;
for(i = 1;i<=n;i++)
scanf("%d",&t[i]);
for(i = 1;i<=n;i++)
scanf("%d",&k[i]);
qsort(t+1,n,sizeof(int),cmp);
qsort(k+1,n,sizeof(int),cmp);
ti = ki = 1;//t表示田忌,k表示国王;ij表示游标
tj = kj = n;
while(ti!=tj){
if(t[ti] < k[ki] || t[tj] < k[kj]){
ti++;
kj--;
res -= 200;
}else if(t[tj] > k[kj]){
tj--;
kj--;
res += 200;
}else if(k[ki] < t[ti]){
ti++;
ki++;
res += 200;
}else{
if(t[ti] < k[kj])
res -= 200;
ti++;
kj--;
}
}
if(t[ti] < k[ki])
res -= 200;
else if(t[ti] > k[ki])
res += 200;
printf("%d\n",res);
}
return 0;
}