题解

cookiebus 2023-10-19 9:00:28 12 返回题目

考察找规律能力。主要需要意识到分奇偶讨论,然后分别进行手推或打表来找到规律。

对于 是偶数的情况,可以发现以每个数字为开头的序列总数都是一样的,所以取中位序列就是第一个数字是 ,其余数字都是

对于 是奇数的情况,首先和上面的思路一样,先确定第一个数字是 。对于后面的数字而言,假设所有序列长度都是 ,那答案就是全部 ,但是本题中也有长度为 的序列,我们主要需要对这些序列进行讨论。(我们称这些序列为“短序列”)

仍然用手推的方式来找规律,假设

1 开头的序列数量和 3 开头的序列数量相等**(*)**,那么我们只讨论 2 开头的序列数量里面的中位序列即可。

2 开头的中位序列有这些:2 21 211 212 213 22 221 222 223 23 231 232 233

假设只有长度为 的序列,那么中位序列是 222。而现在有长度为 的序列,让我们重点关注这些序列:222 左边有 3 个短序列(2、21、22),222 右边有一个短序列(23),所以真正的中位序列是 221,就是答案。

假设 ,那么原本中位序列是 2222,关注 2222 左边的短序列数量和右边的短序列数量,也可以用和 (*) 类似的方法找到规律——左边 21 开头的短序列和右边 23 开头的短序列数量相等。左边 221 开头的短序列和右边 223 开头的短序列相等。那么左边独有的短序列就只有三个了——2、22、222。由于左边比右边多三个数字,所以应该中位序列应该往左移动两格,答案从 2222 变成 222。

左边独有的短序列数量也很好计算,根据上面的规律总结出特征,假设 ,那么短序列就是 2、22、222、2222、...、222...222( 个 2)。也就是说短序列的数量是 个,那么算出原本的中位序列之后,我们将中位序列向左边移动 即可。

参考代码

#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int a[N];
int main()
{
    int n, k;
    cin >> n >> k;
    if (k % 2 == 0)
    {
        cout << k / 2 << " ";
        for (int i = 2; i <= n; i++)
            cout << k << " ";
    }
    else
    {
        for (int i = 1; i <= n; i++)
            a[i] = (k + 1) / 2;
        int t = n;
        for (int i = 1; i <= n / 2; i++)
        {
            if (a[t] == 1)
            {
                t--;
            }
            else
            {
                a[t]--;
                while (t < n)
                    a[++t] = k;
            }
        }
        for (int i = 1; i <= t; i++)
            cout << a[i] << " ";
    }
    return 0;
}
{{ vote && vote.total.up }}