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

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

题意:田忌赛马。田忌与king各有n匹马,每匹对应一个整数,整数大的马赢。田忌赢一场赚200,输一场亏200,平手不赚不亏。求田忌最多能赚多少。

思路:贪心。

1、两数列排序。对田忌的每一匹马,从king的马中找出一匹小于田忌的该匹马且数值最大的。共能找出win对。 

2、然后,在剩余的马中,king的马总是>= 田忌的马,从中找出相等的对数,same.。

3、根据win和same即可得到答案。

PS:题目中没说马对应的数值为正数。也即是可是负数。 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 #define N 1005
 8 #define MIN -100000000
 9 long long a[N], b[N];
10 bool cmp(int x, int y)
11 {
12     return x > y;
13 }
14 
15 int main()
16 {
17     int n;
18     while(scanf("%d",&n)!=EOF)
19     {
20         if(n==0break;
21         for(int i=1; i<=n; i++)
22             cin >> a[i];
23         for(int i=1; i<=n; i++)
24            cin >> b[i];
25         sort(a+1,a+n+1);
26         sort(b+1,b+n+1);
27         int win = 0, num = n;
28         for(int i=1; i<=n; i++)
29         {
30             for(int j=n; j>=1; j--)
31             {
32                 if(a[i]==MIN || b[j]==MIN) continue;
33                 if(a[i]>b[j])
34                 {
35                     win++; a[i] = MIN; b[j] = MIN; num--; break;
36                 }
37             }
38         }
39         //printf("%d\n",win);
40         sort(a+1,a+n+1, cmp);
41         sort(b+1,b+n+1);
42         int same = 0;
43         for(int i=0; i<num; i++)
44         {
45             if(a[1+i]==b[win+1+i]) same++;
46             else break;
47         }
48         int lose = n - same - win;
49         cout << 200*(win-lose) << endl;
50     }
51     return 0;
52 }
View Code 

 

 

posted @ 2013-12-16 20:22  byluoluo  阅读(291)  评论(0编辑  收藏  举报