P9012 [USACO23JAN] Moo Operations B题解

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

Tips: \(1 \le |S| \le 100\) ——题目

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


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

于是你迅速写出了下面的check函数,并用它AC了前几个点
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”就仨字符,那你把它砍成只有仨字符的形式不就得了?反正 \(100\) 的数据量随便折腾。所以,你只需要把仨字符能组成的 8 个字符串都枚举出来,挨个判断子串,如果仨字符的是子串,那么就是子串所需步数+原字符串长度-3。


ACCode
#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记录

posted @ 2024-01-18 21:33  worker2011  阅读(41)  评论(0编辑  收藏  举报