P9012 [USACO23JAN] Moo Operations B 题解

Leo2011 大气压强

第 1 道赛场 AC 的题,必须发篇题解记录一下。

Tips: —— 题目

才 100,这就可以随便整活了。


如果你稍微懂点英语,就会知道第 个点的 都最多只有 个字符,而目标 “MOO” 也是 个字符,所以只需要模拟就可以了。

于是你迅速写出了下面的 check 函数,并用它 AC 了前几个点:

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
int check(string a) {
if (a.size() < 3) // 不让加字符,小于 3 的肯定就废了
return -1;
int step = 0;
if (a == "MOO") // 都一样了你还变它干啥,浪费表情(
return step;
string tmp1 = a;
step++;
if (tmp1[0] == 'M') // 胡乱尝试
tmp1[0] = 'O';
else
tmp1[0] = 'M';
if (tmp1 != "MOO") {
step++;
if (tmp1[2] == 'M')
tmp1[2] = 'O';
else
tmp1[2] = 'M';
} else
return step;
if (tmp1 != "MOO") {
step--; // 撤销第 1 步操作,所以是--
if (tmp1[0] == 'M')
tmp1[0] = 'O';
else
tmp1[0] = 'M';
} else
return step;
if (tmp1 != "MOO")
return -1;
return step;
}

这样你就能顺利的 AC 前三个点了。

那剩下的咋整?

“MOO” 就仨字符,那你把它砍成只有仨字符的形式不就得了?反正 的数据量随便折腾。所以,你只需要把仨字符能组成的 8 个字符串都枚举出来,挨个判断子串,如果仨字符的是子串,那么就是子串所需步数 + 原字符串长度 - 3。


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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <bits/stdc++.h>

using namespace std;

int n;
string str;

int min(int a, int b) {
return a > b ? b : a;
}

bool checkSubString(string a, string b) {
int x = a.size(), y = b.size();
if (x <= y) {
for (int i = 0; i < y; i++) {
if (b[i] == a[0]) {
bool flag = true;
for (int j = 0; j < x; j++)
if (b[i + j] == a[j])
continue;
else {
flag = false;
break;
}
if (flag)
return true;
}
}
}
return false;
}

int check(string a) {
if (a.size() < 3)
return -1;
int step = 0;
if (a == "MOO")
return step;
string tmp1 = a;
step++;
if (tmp1[0] == 'M')
tmp1[0] = 'O';
else
tmp1[0] = 'M';
if (tmp1 != "MOO") {
step++;
if (tmp1[2] == 'M')
tmp1[2] = 'O';
else
tmp1[2] = 'M';
} else
return step;
if (tmp1 != "MOO") {
step--;
if (tmp1[0] == 'M')
tmp1[0] = 'O';
else
tmp1[0] = 'M';
} else
return step;
if (tmp1 != "MOO")
return -1;
return step;
}

int checker(string x) {
if (x.size() <= 3)
return check(x);
int mn = 10000;
string a[] = {"OOO", "OOM", "OMO", "OMM", "MOO", "MOM", "MMO", "MMM"};
for (int i = 0; i < 8; i++) {
if (checkSubString(a[i], x)) {
int tmp = check(a[i]);
if (tmp != -1)
mn = min(mn, (tmp + x.size() - 3));
}
}
if (mn == 10000)
return -1;
return mn;
}

int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
cin >> str;
printf("%d\n", checker(str));
str = "";
}
return 0;
}

AC 记录

  • 标题: P9012 [USACO23JAN] Moo Operations B 题解
  • 作者: Leo2011
  • 创建于 : 2024-01-18 21:33:35
  • 更新于 : 2024-08-21 22:37:58
  • 链接: https://leo2011.eu.org/2024/01/18/p9012-usaco23jan-moo-operations-b-ti-jie/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
P9012 [USACO23JAN] Moo Operations B 题解