codeforces 489B. BerSU Ball 解题报告

题目链接:http://codeforces.com/problemset/problem/489/B

题目意思:给出 n 个 boys 的 skills 和 m 个 girls 的 skills,要求成 pair 的条件为,男和女的 skill 差值最多只能为 1。问成 pair 最多是多少。

    这个不太难,关键是要考虑周全。

  对于某个人,假设他(男)的 skill 值为 i,那么跟他成 pair 的人的 skill 值,只有三种:i-1,i,i+1。跟他成对的女要减少一个。然后女的那边也要搜一遍,再输出较大的就是答案了。

    

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 100 + 5;
 8 int a[maxn], b[maxn];
 9 
10 int get_num(int ta[], int tb[])
11 {
12     int num = 0;
13     for (int i = 1; i <= 100; i++)
14     {
15         if (ta[i])
16         {
17             for (int j = 0; j < ta[i]; j++)
18             {
19                 if (tb[i-1])
20                 {
21                     tb[i-1]--;
22                     num++;
23                 }
24                 else if (tb[i])
25                 {
26                     tb[i]--;
27                     num++;
28                 }
29                 else if (tb[i+1])
30                 {
31                     tb[i+1]--;
32                     num++;
33                 }
34             }
35         }
36     }
37     return num;
38 }
39 
40 int main()
41 {
42     #ifndef ONLINE_JUDGE
43         freopen("in.txt", "r", stdin);
44     #endif
45 
46     int n, m, input;
47     while (scanf("%d", &n) != EOF)
48     {
49         memset(a, 0, sizeof(a));
50         memset(b, 0, sizeof(b));
51 
52         for (int i = 0; i < n; i++)
53         {
54             scanf("%d", &input);
55             a[input]++;
56         }
57         scanf("%d", &m);
58         for (int i = 0; i < m; i++)
59         {
60             scanf("%d", &input);
61             b[input]++;
62         }
63         int ans = 0;
64         ans = max(get_num(a, b), get_num(b, a));
65         printf("%d\n", ans);
66     }
67     return 0;
68 }

 

posted @ 2014-11-18 23:47  windysai  阅读(501)  评论(0编辑  收藏  举报