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==0) break;
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 }
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==0) break;
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 }