POJ 2287 - Tian Ji -- The Horse Racing(田忌赛马) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:http://poj.org/problem?id=2287

题目大意:

田忌赛马的故事就不用多说了吧....

输入包含多组数据(<=50),以0作为结束标志。

每组数据的第一行给出一个数n(n<=1000),表示齐王和田忌各有多少匹马。

第二行有n个数,表示田忌的马的速度值。

第三行有n个数,表示齐王的马的速度值。

在比赛中,速度值较大的马一定获胜。约定每局比赛中败者付给胜者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

分析:

洛谷上也有类似的题(P1650),然而洛谷的题目描述里提到了二分图匹配,好像把人给吓到了2333

贪心。先把马的速度值从小到大排个序。

每一局比赛,先判断当前田忌最快的马能否战胜齐王最快的马,如果能,则赢得200银币,否则进行第二步判断。

第二步:判断当前田忌最慢的马能否战胜齐王最慢的马,如果能,则赢得200银币,否则用最慢的马去对战齐王最快的马,失去200银币。

还要注意平局的情况,如果田忌和齐王最慢的马速度相等,且最慢的马和最快的马速度也相等,才有平局的必要(而且只能平局)。

否则用最慢的马去对战齐王最快的马,结果不会更坏。

其实在判断的时候是不需要把a,b变成0的,反正你之后也不可能再遇到....窝只是强迫症一下qwq

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5
 6 const int MAXN = 2005;
 7
 8 inline void read(int &x)
 9 {
10     char ch = getchar(),c = ch;x = 0;
11     while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar();
12     while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar();
13     if(c == ‘-‘) x = -x;
14 }
15
16 int a[MAXN],b[MAXN];
17 // 田忌马    齐王马
18 int n,m,ans = 0;
19
20 inline void init()
21 {
22     m = n,ans = 0;
23     memset(a,0,sizeof(a));
24     memset(b,0,sizeof(b));
25 }
26
27 int main()
28 {
29
30     read(n);
31     while(n)
32     {
33         init();
34         for(int i = 1;i <= n;++ i)
35             read(a[i]);
36         for(int i = 1;i <= n;++ i)
37             read(b[i]);
38         std::sort(a+1,a+1+n);
39         std::sort(b+1,b+1+n);
40         if(a[n] < b[1])
41             ans = -200*n;
42         else if(a[1] > b[n])
43             ans = 200*n;
44         //两种特殊情况:全输/全赢
45         else
46         {
47             int i = 1,j = 1;
48             while(i <= n && j <= m)
49             {
50                 if(a[n] > b[m])
51                 {
52                     a[n--] = 0,b[m--] = 0,ans += 200;
53                 }
54                 else if(a[i] > b[j])
55                 {
56                     a[i++]= 0,b[j++] = 0,ans += 200;
57                 }
58                 else if(a[i] == b[j] && a[i] == b[m])
59                 {
60                     a[i++] = 0,b[j++] = 0;
61                 }
62                 else
63                     a[i++] = 0,b[m--] = 0,ans -= 200;
64             }
65         }
66         printf("%d\n",ans);
67         read(n);
68     }
69     return 0;
70 }
时间: 2024-08-11 05:45:57

POJ 2287 - Tian Ji -- The Horse Racing(田忌赛马) 题解的相关文章

poj 2287 Tian Ji -- The Horse Racing

poj 2287 Tian Ji -- The Horse Racing 题意: 田忌赛马 如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以得到200两银子,输一局,田忌就要输掉200两银子,平局的话不输不赢. 请问田忌最多能赢多少银子? 思路: 贪心: 如果当前最好的马可以胜齐王最好的马,那么让这两匹马比一场: 如果当前最差的马能胜齐王最差的马,那么让这两匹马比一场: 如果上面两个条件都不满足,那么让当前最差的马和齐王最好的马

POJ 2287 Tian Ji -- The Horse Racing(贪心)

题意:田忌和齐王有n匹马,进行n局比赛,每局比赛输者给胜者200,问田忌最多能得多少钱. 分析:如果田忌最下等的马比齐王最下等的马好,是没必要拿最下等的马和齐王最好的马比的.(最上等马同理) 因此,如果田忌最下等的马>齐王最下等的马或者田忌最上等的马>齐王最上等的马,直接得200,如果不满足该条件,那么才让田忌最下等的马与齐王最上等的马来比. #pragma comment(linker, "/STACK:102400000, 102400000") #include<

poj 2287 Tian Ji -- The Horse Racing (贪心)

# include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int main() { int n,i,j,k,count; int flag1[1010],flag2[1010],a[1010],b[1010]; while(~scanf("%d",&n),n) { for(i=0;i<n;i++) scanf("%d&

(hdu step 1.3.3)Tian Ji -- The Horse Racing(田忌赛马)

题目: Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4411 Accepted Submission(s): 1069   Problem Description Here is a famous story in Chinese history. "That was about 2

LA 3266 Tian Ji -- The Horse Racing 田忌赛马 【贪心】

题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33702 贪心: 1,如果田忌的最快马快于齐王的最快马,则两者比. (因为若是田忌的别的马很可能就赢不了了,所以两者比) 2,如果田忌的最快马慢于齐王的最快马,则用田忌的最慢马和齐王的最快马比. (由于所有的马都赢不了齐王的最快马,所以用损失最小的,拿最慢的和他比) 3,若相等,则比较田忌的最慢马和齐王的最慢马 3.1,若田忌最慢马快于齐王最慢马,两者比. (田忌

[HDU1052]Tian Ji -- The Horse Racing(田忌赛马)

题目大意:田忌赛马问题,给出田忌和齐威王的马的数量$n$和每匹马的速度$v$,求田忌最多赢齐威王多少钱(赢一局得200,输一局扣200,平局不得不扣). 思路:贪心. 1.若田忌最慢的马可以战胜齐王最慢的马,那么就让它战胜那匹慢马,胜利场次加1.(田忌最慢马 > 齐王最慢马) 2.若田忌最慢的马不能战胜齐王最慢的马,那么它更加不能战胜其他的马,那就让它输给齐王最快的马,失败场次加1.(田忌最慢马 < 齐王最快马) 3.若田忌最慢的马与齐王最慢的马速度相等.此时,打平是错误的. 因为自己的快马很

hdoj 1052 Tian Ji -- The Horse Racing【田忌赛马】 【贪心】

思路:先按从小到大排序, 然后从最快的開始比(如果i, j 是最慢的一端, flag1, flag2是最快的一端 ),田的最快的大于king的 则比較,如果等于然后推断,有三种情况: 一:大于则比較,二等于在推断田的最慢的是不是比king的最快的慢,三小于则与king的最快的比較: Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe

HDU 1052 Tian Ji -- The Horse Racing(贪心)(2004 Asia Regional Shanghai)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1052 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

HDU1052 Tian Ji -- The Horse Racing 贪心

Tian Ji -- The Horse Racing Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1052 Description Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian Ji was a