標籤:數學 hdu
轉載請註明出處:http://blog.csdn.net/u012860063
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1052
Tian Ji -- The Horse Racing
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17346 Accepted Submission(s): 5043
Problem DescriptionHere is a famous story in Chinese history.
"That was about 2300 years ago. General Tian Ji was a high official in the country Qi. He likes to play horse racing with the king and others."
"Both of Tian and the king have three horses in different classes, namely, regular, plus, and super. The rule is to have three rounds in a match; each of the horses must be used in one round. The winner of a single round takes two hundred silver dollars from the loser."
"Being the most powerful man in the country, the king has so nice horses that in each class his horse is better than Tian‘s. As a result, each time the king takes six hundred silver dollars from Tian."
"Tian Ji was not happy about that, until he met Sun Bin, one of the most famous generals in Chinese history. Using a little trick due to Sun, Tian Ji brought home two hundred silver dollars and such a grace in the next match."
"It was a rather simple trick. Using his regular class horse race against the super class from the king, they will certainly lose that round. But then his plus beat the king‘s regular, and his super beat the king‘s plus. What a simple trick. And how do you think of Tian Ji, the high ranked official in China?"
Were Tian Ji lives in nowadays, he will certainly laugh at himself. Even more, were he sitting in the ACM contest right now, he may discover that the horse racing problem can be simply viewed as finding the maximum matching in a bipartite graph. Draw Tian‘s horses on one side, and the king‘s horses on the other. Whenever one of Tian‘s horses can beat one from the king, we draw an edge between them, meaning we wish to establish this pair. Then, the problem of winning as many rounds as possible is just to find the maximum matching in this graph. If there are ties, the problem becomes more complicated, he needs to assign weights 0, 1, or -1 to all the possible edges, and find a maximum weighted perfect matching...
However, the horse racing problem is a very special case of bipartite matching. The graph is decided by the speed of the horses --- a vertex of higher speed always beat a vertex of lower speed. In this case, the weighted bipartite matching algorithm is a too advanced tool to deal with the problem.
In this problem, you are asked to write a program to solve this special case of matching problem.
InputThe 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.
OutputFor each input case, output a line containing a single number, which is the maximum money Tian Ji will get, in silver dollars.
Sample Input
392 83 7195 87 74220 2020 20220 1922 180
Sample Output
20000
Source2004 Asia Regional Shanghai RecommendJGShining | We have carefully selected several similar problems for you: 1051 1257 1053 1789 2187
/*
每次取田忌的最快的馬與齊王最快的馬比較,有三種情況。
一、田忌最快的馬比齊王最快的快,那麼直接用田忌最快的馬去贏齊王最快的馬。
二、田忌最快的馬比齊王最快的慢,那麼用田忌最慢的馬去輸齊王最快的馬。
三、田忌最快的馬與齊王最快的馬速度一樣。
先用田忌最慢的馬與齊王最慢的馬比較。
若田忌比齊王快,直接贏掉齊王最慢的馬。
否則田忌最慢的馬再去與齊王最快的馬比。
如果最快最慢的馬都一樣,用田忌最慢的馬和齊王最快的馬比。
*/
代碼如下:
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <cstdlib>#include <climits>#include <ctype.h>#include <queue>#include <stack>#include <vector>#include <deque>#include <set>#include <map>#include <iostream>#include <algorithm>using namespace std;#define PI acos(-1.0)#define INF 0x3fffffffint main(){int n,i,j;int a[1047],b[1047];while(~scanf("%d",&n) && n){for(i = 1 ; i <= n ; i++){scanf("%d",&a[i]);}sort(a+1,a+n+1);for(i = 1 ; i <= n ; i++){scanf("%d",&b[i]);}sort(b+1,b+n+1);int sum = 0;int ka1,kb1;//分別計算田忌和齊王速度慢的馬還未使用的當前序號邊界int ka2,kb2;//分別計算田忌和齊王速度快的馬還未使用的當前序號邊界ka1 = kb1 = 1;ka2 = kb2 = n;for(i = n ; i >= 1; i--){if(a[ka2] > b[kb2])//如果田忌最快的馬比齊王最快的馬快直接吃掉{sum+=200;ka2--,kb2--;}else if(a[ka2] == b[kb2])//如果雙方最快的馬速度相同{if(a[ka1] > b[kb1])//如果田忌最慢的馬比齊王最慢的快,直接吃掉{sum+=200;ka1++,kb1++;}else if(a[ka1] <= b[kb1])//如果田忌最慢的馬和齊王最慢的馬速度相同或比齊王慢{if(a[ka1] < b[kb2])//如果田忌最慢的馬比齊王最快的馬慢,用最慢的去輸齊王最快的{//PS:可能會有讀者吐槽,最慢的馬當讓比最快的慢,其實不然,比如題目的第二個案例sum-=200;ka1++;kb2--;}else if(a[ka1] == b[kb2])//雙方的馬全是一樣的速度的情況,那麼直接可以忽略掉錢的變化{ka1++,kb2--;}}}else if(a[ka2] < b[kb2])//如果田忌最快的馬比齊王最快的馬慢,用田忌最慢的馬去輸齊王最快的馬{sum-=200;ka1++;kb2--;}}printf("%d\n",sum);}return 0;}