学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考青铜组别比赛学习过程中的题目,记录每一个瞬间。
附上汇总贴:USACO历年青铜组真题解析 | 汇总-CSDN博客
【题目描述】
农夫约翰给了奶牛贝西 Q 个新字符串 (1≤Q≤100) ,其中只有字符 M 和 O ,她想将 Q 个字符串都变成 MOO。
贝西可以用如下的方式改变字符串:
- 用相反的字符替换第一个或最后一个字符(将 M 变成 O ,将 O 变成 M )。
- 删除第一个或最后一个字符。
贝西只想用最少的次数完成改变。请你帮她找到需要的最小改变次数。如果不可能在有限的步数中完成这个任务,请输出 -1 。
【输入】
输入数据的第一行是一个正整数 Q 。
接下来的 Q 行中,每行一个只包含大写字母 M 或 O 的字符串 S ,保证 1≤∣S∣≤100 。
【输出】
输出 Q 行,每行为该测试点最小操作次数,如果不可能在有限的步数中完成这个任务,请输出 -1 。
【输入样例】
3
MOMMOM
MMO
MOO
【输出样例】
4
-1
0
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int q, ans;
string s;
int main()
{
cin >> q; // 输入q
while (q--) { // 遍历q次询问
cin >> s;
int len = s.length(); // 定义长度变量(简化后面的代码)
if (s.find("MOO")>=0 && s.find("MOO")<=len) { // 如果可以找到MOO
ans = len - 3; // 字符串截掉这3位后的数就是要调整的数
cout << ans << endl; // 打印结果
continue; // 继续下次询问
}
if (s.find("MOM")>=0 && s.find("MOM")<=len) { // 如果可以找到MOM
ans = len - 3 + 1; // 除截掉这3位的次数外,还要再加一次M改为O
cout << ans << endl; // 打印结果
continue; // 继续下次询问
}
if (s.find("OOO")>=0 && s.find("OOO")<=len) { // 如果可以找到OOO
ans = len - 3 + 1; // 除截掉这3位的次数外,还要再加一次O改为M
cout << ans << endl; // 打印结果
continue; // 继续下次询问
}
if (s.find("OOM")>=0 && s.find("OOM")<=len) { // 如果可以找到OOM
ans = len - 3 + 2; // 除截掉这3位的次数外,还要再加2次,O改为M,M改为O
cout << ans << endl; // 打印结果
continue; // 继续下次询问
}
cout << -1 << endl; // 不符合上述场景的则输出-1,说明找不到
}
return 0;
}
【运行结果】
3
MOMMOM
4
MMO
-1
MOO
0