题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16442
题意:
田忌赛马问题。多组案例,以输入n值为0时结束。田忌与国王各有n匹马,进行n场比赛,规定每匹马只能上场一次,每场比赛获胜则获得200金币,否则扣除200金币。给定双方马速,求田忌最多获取多少金币。
案例:
Sample Input
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
Sample Output
200
0
0
分析:
贪心策略。
将双方最慢马匹进行竞赛,
若田忌一方马速快则获取200金币,
若田忌一方马速慢于国王最慢的马,则用田忌最慢的马消耗国王最快的马以获取其它马匹胜利的机会,
若双方马速相等,则又需分情况讨论:先判断双方最快的马匹之间的赛果,若田忌胜则获取200金币,否则用田忌最慢马匹消耗国王最快马匹。注意!田忌最慢马匹不一定输给国王最快马匹,也可能平局。
源代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int n,ant,i,j; 6 int a[1005],b[1005]; 7 void cmp() 8 { 9 10 int x1=0,x2=n-1,y1=0,y2=n-1; 11 while(x1<=x2) 12 { 13 if(a[x1]>b[y1])//双方最慢的马进行比较,田忌胜 14 { 15 ant+=200; 16 x1++; 17 y1++; 18 } 19 else if(a[x1]<b[y1])//田忌输,用最慢的马与国王最快的马竞赛 20 { 21 ant-=200; 22 x1++; 23 y2--; 24 } 25 else//马速相等 26 { 27 if(a[x2]>b[y2])//双方最快的马进行竞赛,田忌胜 28 { 29 ant+=200; 30 x2--; 31 y2--; 32 } 33 else 34 { 35 if(a[x1]<b[y2])//用田最慢的马输给国王最快的马 36 ant-=200; 37 x1++; 38 y2--; 39 } 40 } 41 } 42 } 43 int main() 44 { 45 while(scanf("%d",&n)&&n) 46 { 47 for(i=0;i<n;i++) 48 scanf("%d",&a[i]);//田忌方马速 49 for(i=0;i<n;i++) 50 scanf("%d",&b[i]);//国王方马速 51 sort(a,a+n);//排序 52 sort(b,b+n); 53 ant=0;//马赛前田忌拥有金币 54 cmp(); 55 printf("%d ",ant); 56 } 57 return 0; 58 }