1 条题解

  • 0
    @ 2026-5-18 22:14:46

    solution:

    题目要求为给定一个只含 MO 的字符串,问把它转化为 MOO 的最小操作数,如果无法完成输出 -1 。有两个操作:

    • 将字符串开头或结尾的字符修改为另一个;
    • 删除字符串开头或结尾的字符。

    首先,如果字符串的长度小于 3 时肯定不行;其次,我们可以将任何长度大于 2 的字符串删到只剩 3 个,而首尾的字符串可以修改,那么是否可行就取决于中间的字符是不是 O 。到这可以发现,操作次数为字符串长度减一再减字符 O 左边是否为 M 和右边是否为 O
    所以解法就出来了,先排除长度小于 3 的字符串,再枚举 1 到字符串长度减二的字符 O ,有则更新答案最小值,最后判断答案是否有更新。

    code:

    思路前面已有详细讲解,此处不再多说。

    #include <bits/stdc++.h>
    using namespace std;
    string s;
    int n;
    int solve(){
    	if(s.size()<3) return -1;
    	int w=1e9;
    	for(int i=1,l=s.size()-1;i<l;i++){
    		if(s[i]=='O') w=min(w,int(s.size()-1-(s[i+1]=='O')-(s[i-1]=='M')));
    	}
    	return (w==1e9?-1:w);
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0);cout.tie(0);
    	cin>>n;
    	while(n--){
    		cin>>s;
    		cout<<solve()<<'\n';
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    6978
    时间
    2000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    35
    已通过
    18
    上传者