/* hdu-1052 Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14456 Accepted Submission(s): 4125 Problem Description Here 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. 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 3 92 83 71 95 87 74 2 20 20 20 20 2 20 19 22 18 0 Sample Output 200 0 0 Source 2004 Asia Regional Shanghai Recommend JGShining 題意: 田忌賽馬 解題報告: 關鍵在於田忌最慢的馬,能先贏就先贏,不能贏就去消耗齊王最快的馬, 然后再來考慮最快的馬,能先贏就先贏,不能贏說明現在田忌和齊王最快的 馬和最慢的馬都相等,再來考慮把田忌最慢的馬和齊王最快的馬比較。 可能更小,但也可能相等。(要按順序哦,親。) 1.當田忌最慢的馬比齊王最慢的馬快,贏一場先 2.當田忌最慢的馬比齊王最慢的馬慢,和齊王最快的馬比,輸一場 3.當田忌最快的馬比齊王最快的馬快時,贏一場先。 4.當田忌最快的馬比齊王最快的馬慢時,拿最慢的馬和齊王最快的馬比,輸一場。 5.當田忌最快的馬和齊王最快的馬相等時,拿最慢的馬來和齊王最快的馬比. //以下是網上的證明 證明:田忌最快的馬和齊王最快的馬相等時拿最慢的馬來和齊王最快的馬比有最優解。 1)假設他們有n匹馬,看n=2的時候. a1 a2 b1 b2 因為 田忌最快的馬和齊王最快的馬相等 所以a1=b1,a2=b2 所以這種情況有2種比賽方式,易得這兩種方式得分相等。 2)當數列a和數列b全部相等等時(a1=b1,a2=b2...an=bn), 顯然最慢的馬來和齊王最快的馬比有最優解,可以贏n-1長,輸1場,找不到更好的方法了。 3)當數列a和數列b元素全部相等時(a1=b1=a2=b2...=an=bn),無法贏也不輸。 現在假設n匹馬時拿最慢的馬來和齊王最快的馬比有最優解, 證明有n+1匹馬時拿最慢的馬來和齊王最快的馬比也有最優解。 數列 a1 a2 a3 a4...an an+1 b1 b2 b3 b4...bn bn+1 其中ai>=ai-1,bi>=bi-1 數列a和數列b不全部相等時,拿最慢的馬來和齊王最快的馬比數列得到數列 (a1) a2 a3 a4...an an+1 b1 b2 b3 b4...bn (bn+1) 分4種情況討論 1.b1=b2,an=an+1 則有 a2 a3 a4...an b2 b3 b4...bn 其中a2>=a1,a1=b1,b1=b2,得a2>=b2(此后這種大小關系不再論述),an>=bn. 此時若a2=b1,根據歸納假設,有最優解,否則a2>根據前面“公理”論證有最優解。 當且僅當a數列,b數列元素全部相等時有an+1=b1,已證得,所以an+1>b1, 贏回最慢的馬來和齊王最快的馬比輸的那一場。 2.b1<=b2,an=an+1 交換 b1,b2的位置, 數列 (a1) a2 a3 a4...an an+1 b2 b1 b3 b4...bn (bn+1) 此時 a2>=a1,an>=bn, 對於子表 a2 a3 a4...an b1 b3 b4...bn 根據前面“公理”或歸納假設,有最優解。 an+1>=b2, 當且僅當b2=b3=b4=..=bn+1時有an+1=b2,這種情況, a中其它元素<=b1,b2,b3,b4..bn,對於這部分來說,能贏 x盤(x<=n), 假如不拿最慢的馬來和齊王最快的馬比則拿最快的馬來和齊王最快的馬比, 此時平一盤,能贏x-1盤,而拿最慢的馬來和齊王最快的馬 比,輸一盤能贏x盤, 總的來說,還是X這個數,沒有虧。 3.b1=b2,an<=an+1 4.b1<=b2,an<=an+1證明方法類似,不再重復。 以證得當有n+1匹馬的時候,田忌和齊王最快最慢的馬速度相等時, 拿最慢的馬來和齊王最快的馬比有最優解,已知當n=2時成立, 所以對於n>2且為整數(廢話,馬的只數當然是整數)時也成立。 當n=1時....這個似乎不用討論. */ #include <iostream> #include<algorithm> #include<queue> #include<stack> #include<cmath> #include<string.h> #include<stdio.h> #include<stdlib.h> using namespace std; #define maxn 2600 int a[maxn],b[maxn]; int main() { int N,i,j,i1,j1,sum; while(scanf("%d",&N),N) { for(i=0; i<N; i++) scanf("%d",&a[i]); for(i=0; i<N; i++) scanf("%d",&b[i]); sort(a,a+N); sort(b,b+N); sum=0; for(i=0,j=N-1,i1=0,j1=N-1;i1<=j1&&i<=j;) { if(a[i]>b[i1]) { i++; i1++; sum++; } else if(a[i]<b[i1]) { i++; j1--; sum--; } else if(a[j]>b[j1]) { j--; j1--; sum++; } else if(a[j]<b[j1]) { i++; j1--; sum--; } //現在剩余就是最快的和最慢的都相等的情況, //則把田忌最慢的和齊王最快的比較 else if(a[i]<b[j1]) { i++; j1--; sum--; } else { i++; j1--; } } printf("%d\n",sum*200); } return 0; } /* 5 100 99 98 97 96 99 99 98 95 94 600 */
