1 条题解

  • 0
    @ 2025-8-14 10:11:06

    https://www.luogu.com.cn/problem/AT_arc091_c

    #include <bits/stdc++.h>
    using namespace std;
    int n, a, b;
    vector<int> ans;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> a >> b;
        if (n < (a + b - 1) || 1LL * a * b < n)
        {
            cout << "-1";
            return 0;
        }
        // 构造一个长度为 a 的最大上升放前面
        for (int i = n - a + 1; i <= n; i++)
            ans.push_back(i);
        n -= a;
        b--; // 第一组构成了下降部分的第一项,后续还需要 b-1 组
        // 1~n 做出来 b 组,每组都不超过 a 个上升
        while (n - a >= b - 1) // 这一组拿 a 个,剩下的还能凑出来 b-1组
        {
            for (int i = n - a + 1; i <= n; i++)
                ans.push_back(i);
            n -= a;
            b--;
        }
        // 当前最多几个
        if (n >= 1) // 还需要做
        {
            int now = n - (b - 1);
            for (int i = n - now + 1; i <= n; i++)
                ans.push_back(i);
            n -= now;
            b--;
        }
        // 一个一个放,n 组,每组 1 个
        for (int i = n; i >= 1; i--)
            ans.push_back(i);
        for (int i = 0; i < ans.size(); i++)
            cout << ans[i] << " ";
        return 0;
    }
    
    • 1

    序列!上升下降都有要求!【NOIP2023模拟赛T4】

    信息

    ID
    53
    时间
    2000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    47
    已通过
    5
    上传者