BZOJ 1034 [ZJOI2008]泡泡堂BNB

类似于田忌赛马,尽量让最弱的打最弱,最强的打最强的。如果最弱的无法击败对方最弱的,就耗掉对方最强的。

听起来很容易。。然而由于存在实力相等+1分的情况,处理起来有点小问题。。

最后对着别人的代码才调对qaq

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 void Get_Val(int &Ret)
 8 {
 9     Ret = 0;
10     char ch;
11     while ((ch = getchar()), (ch > '9' || ch < '0'))
12         ;
13     do
14     {
15         (Ret *= 10) += ch - '0';
16     }
17     while ((ch = getchar()), (ch >= '0' && ch <= '9'));
18 }
19 
20 const int Max_N(100050);
21 
22 int N;
23 int a[Max_N], b[Max_N];
24 
25 void init()
26 {
27     Get_Val(N);
28     for (int i = 1;i <= N;++i)
29         Get_Val(a[i]);
30     for (int i = 1;i <= N;++i)
31         Get_Val(b[i]);
32     sort(a + 1, a + 1 + N);
33     sort(b + 1, b + 1 + N);
34 }
35 
36 int Best()
37 {
38     int al(1), ar(N), bl(1), br(N), Ans(0);
39     while (al <= ar)
40     {
41         if (a[al] > b[bl])
42         {
43             Ans += 2;
44             ++al, ++bl;
45         }
46         else
47             if (a[ar] > b[br])
48             {
49                 Ans += 2;
50                 --ar, --br;
51             }
52             else
53             {
54                 Ans += (a[al] == b[br]);
55                 ++al, --br;
56             }
57     }
58     return Ans;
59 }
60 
61 void work()
62 {
63     printf("%d", Best());
64     for (int i = 1;i <= N;++i)
65         swap(a[i], b[i]);
66     printf(" %d\n", (N << 1) - Best());
67 }
68 
69 int main()
70 {
71     init();
72     work();
73     return 0;
74 }
BZOJ 1034

 

你可能感兴趣的:(BZOJ 1034 [ZJOI2008]泡泡堂BNB)