1 条题解
-
0
solution:
题目要求为给定一个只含
M和O的字符串,问把它转化为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
- 上传者