#2025.「NOIP 2004 普及组」火星人 题解 审核通过

CPP 刷题王 2024-06-21 16:56:57 2024-06-21 17:22:14 9

解题思路

看了一下,加上我一共有 个人用到了 next_permutation,占比高达 ,这充分体现了 stl 带给我们的优越感。

回归正题,对于一个集合 里面存的是 的所有排列分别组成的数字,我们先将这些数字从小到大排列再加入集合。

的大小, 为集合中从小到大的第 个数。

根据题意,,得到规律 。题目还要求加上一个数 ,所以我们要在集合 中找出值为 的元素,所以我们就可以看成是 ,即当前序列的下 个排列。

由于 C++ STL 中自带求下一个 排列的函数 next_permutation,所以我们就可以做出这道题目了。

int main() {
    ios::sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];
    while (m--) {
        next_permutation(a + 1, a + 1 + n);
    }
    for (int i = 1; i <= n; i++) cout << a[i] << ' ';
    return 0;
}

STL 就是好,希望没有用这个方法的同学们不要……

{{ vote && vote.total.up }}