返回顶部

Moo

题目的传送门

单纯用string暴力模拟,肯定超时,所以我们不能用数组或者字符串。

类似二分法!就是把由多个mooooo组成的字符串拆分成之后一个m与多个o组成的子串

找规律

#include <bits/stdc++.h>
using namespace std;
int n, t, k = 3, m;
int main()
{
    // 就是把由多个mooooo组成的字符串拆分成之后一个m与多个o组成的子串
    cin >> n;
    m = n;
    while (t <= n)
        t = t * 2 + k, k++; // 算出长度
    k--;
    while (t > 0)
    {
        t = (t - k) / 2; // 不断递归,推出m所在最短的字符

        if (m > t)
        { // 二分法
            if (m <= t + k) // 在左边
            {
                if (m == t + 1) // 串首
                    return cout << "m", 0;
                else
                    cout << "o", 0;
            }
            else // 在右边
            {
                m = m - (t + k);
            }
        }
        k--;
    }
    return 0;
}

这道题代码比较难懂,回头要多看看了。

posted @ 2022-01-28 08:43  zrc4889  阅读(106)  评论(0编辑  收藏  举报