CF1215E. Marbles

$M$先手填$?$,如果填完之后左数字之和相等$B$赢,反之。$M$赢。

  • 只能填$[0,9]$
  • $?$和长度为偶数。

还是分类讨论稳妥。

  • $suml=sumr$,显然如果两侧问号不同,就无法相等。
  • $suml>sumr$,$M$一定要填左侧尽量使无法相等,然后$B$也是尽量大的填右侧。如果左边问号$\geq$右侧显然不可能,如果右侧多,剩下必定使偶数个(根据条件)。如果差不是$9\times$剩余问号/2,$M$可以捣乱,无法使其相等。
  • 同理
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define mk make_pair
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
int n, l, r, suml, sumr;
char s[N];
int flag;
int main()
{
scanf("%d", &n);
scanf("%s", s + 1);
for (int i = 1; i <= n; i++)
{
if (i <= n / 2)
{
if (s[i] == '?')
l++;
else
suml += s[i] - '0';
}
else
{
if (s[i] == '?')
r++;
else
sumr += s[i] - '0';
}
}
if (suml == sumr)
{
if (l != r)
flag = 1;
else
flag = 0;
}
else if (suml > sumr)
{
if (l >= r)
flag = 1;
else
{
int p = (r - l) / 2;
if (sumr + p * 9 == suml)
flag = 0;
else
flag = 1;
}
}
else if (suml < sumr)
{
if (l <= r)
flag = 1;
else
{
int p = (l - r) / 2;
if (suml + p * 9 == sumr)
flag = 0;
else
flag = 1;
}
}
if (flag)
puts("Monocarp");
else
puts("Bicarp");
}