P9012 [USACO23JAN] Moo Operations B 题解

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
  • 更新于 : 2025-06-01 13:52:47
  • 链接: https://www.leo2011.eu.org/2024/01/18/p9012-usaco23jan-moo-operations-b-ti-jie/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
Nickname
Email
Website
  • OωO
  • |´・ω・) ノ
  • ヾ (≧∇≦*) ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠( ᐛ 」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ °ο°) ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • ヾ (´・ ・`。) ノ "
  • (ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ °Д °;) っ
  • (,,´・ω・)ノ"(´ っ ω・`。)
  • ╮(╯▽╰)╭
  • o(*////▽////*)q
  • >﹏<
  • ( ๑´•ω•) "(ㆆᴗㆆ)
  • 😂
  • 😀
  • 😅
  • 😊
  • 🙂
  • 🙃
  • 😌
  • 😍
  • 😘
  • 😜
  • 😝
  • 😏
  • 😒
  • 🙄
  • 😳
  • 😡
  • 😔
  • 😫
  • 😱
  • 😭
  • 💩
  • 👻
  • 🙌
  • 🖕
  • 👍
  • 👫
  • 👬
  • 👭
  • 🌚
  • 🌝
  • 🙈
  • 💊
  • 😶
  • 🙏
  • 🍦
  • 🍉
  • 😣
  • 颜文字
  • Emoji
  • Bilibili
0 comments
No comment