正在载入在线练习界面,本页内容可直接阅读…

AK CSP › NOIP 提高 2018 第一轮真题 › 第 24 题

NOIP 提高 2018 第一轮 第 24 题:枚举全排列求下一个排列

阅读程序 · 搜索与图遍历(DFS/BFS) · 答案 213564; 325614

题目

阅读程序写结果:

#include <iostream>
using namespace std;
const int N = 110;
bool isUse[N];
int n, t;
int a[N], b[N];
bool isSmall() {
    for (int i = 1; i <= n; ++i)
        if (a[i] != b[i]) return a[i] < b[i];
    return false;
}
bool getPermutation(int pos) {
    if (pos > n) {
        return isSmall();
    }
    for (int i = 1; i <= n; ++i) {
        if (!isUse[i]) {
            b[pos] = i; isUse[i] = true;
            if (getPermutation(pos + 1)) {
                return true;
            }
            isUse[i] = false;
        }
    }
    return false;
}
void getNext() {
    for (int i = 1; i <= n; ++i) {
        isUse[i] = false;
    }
    getPermutation(1);
    for (int i = 1; i <= n; ++i) {
        a[i] = b[i];
    }

}
int main() {
    scanf("%d%d", &n, &t);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
    }
    for (int i = 1; i <= t; ++i) {
        getNext();
    }
    for (int i = 1; i <= n; ++i) {
        printf("%d", a[i]);
        if (i == n) putchar(’\n’); else putchar(’ ');
    }
    return 0;
}

本小题

输入 1:6 10 1 6 4 5 3 2
请写出输出结果。

输入 2:6 200 1 5 3 4 2 6
请写出输出结果。

答案

213564; 325614

题解

考点定位

本题考「全排列搜索模拟」,对应大纲 4.3.3 搜索(难度【5】)。

解题过程

程序枚举全排列找「比输入排列大的下一个排列」的暴力版。输入 6 10 1 6 4 5 3 2 与 6 200 1 5 3 4 2 6:

输出 213564; 325614(两组输入各一,连写分号)。

易错提醒

① getNext 暴力枚举字典序下一个排列(isSmall 判定);② t 次getNext = 连续应用 t 次后到达的排列;③ 与 std::next_permutation 结果对照验证。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号