区赛题 奥特曼打怪兽 请求帮助

奥特曼打怪兽

小X是个奥特曼迷,他收集了好多各种各样的奥特曼玩具,什么佐菲奥特曼、赛文奥特曼、杰克奥特曼等等。当然,这里为了简化问题,我们不区分奥特曼的种类。仅有奥特曼是不好玩的,还要有对手,所以小X也会收集各种怪兽玩具。
一天,小X把这些玩具排成一排。在某一秒,如果某个奥特曼的右边相邻位置存在怪兽,这个奥特曼就会把它打败并将它踢到自己的左边。换句话说,如果第i个位置是奥特曼,第i+1个位置是怪兽,那么1秒钟后会变成第i个位置是怪兽,第i+1个位置是奥特曼。
我们用U表示奥特曼,M表示怪兽,如果一开始的排列是这样的:UUMM,则
1秒后:UMUM
2秒后:MUMU
3秒后:MMUU
我们发现,一段时间后,所有的怪兽都会在所有奥特曼的左边,现在的问题是这个时间是多少秒?

输入
一行,一个长度为n的由U和M组成的字符串(n≤106)。
如果第i个字符是U,表示这个位置是奥特曼,如果是M,表示这个位置是怪兽。

输出
输出一个整数,表示将队伍中的所有怪兽移到奥特曼左边所需的秒数。

样例

UUMM

3

#include <bits/stdc++.h>
using namespace std;

int main()
{
     ios::sync_with_stdio(0);
     string n;
     int u,m;
     cin>>n;
     for(int i=1;i<=n.size();i++) 
     {
         if(n[i]=='U')
         {
             u=u+1;
         }
         else if(n[i]=='M')
         {
             m=m+1;
         }
     }
     cout<<(u+m-1)/10<<endl; 
    return 0;
}



参考GPT和自己的思路:你的程序存在几个问题:

  1. 在循环中,应该从0开始遍历字符串,因为下标从0开始计数,而不是从1开始。

  2. 在统计U和M的个数时,变量u和m没有初始化,应该初始化为0。

  3. 在输出答案时,题目中要求的是把所有怪兽移到奥特曼左边的时间,而你的程序输出的是把所有怪兽移到奥特曼右边的时间。正确的计算方式应该是(u + m - 1) / m。

下面是修正过的代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(0);
    string n;
    int u = 0, m = 0;  // 初始化为0
    cin >> n;
    for (int i = 0; i < n.size(); i++) {  // 从0开始遍历
        if (n[i] == 'U') {
            u = u + 1;
        } else if (n[i] == 'M') {
            m = m + 1;
        }
    }
    cout << (u + m - 1) / m << endl;  // 输出把怪兽移到奥特曼左边的时间
    return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^