社区讨论

超时了!

P1088[NOIP 2004 普及组] 火星人参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@m2n7bi7q
此快照首次捕获于
2024/10/24 19:09
去年
此快照最后确认于
2025/11/04 16:19
4 个月前
查看原帖
为什么我这个超时了啊?求大佬指点
CPP
#include <iostream>
#include <cstdio>
using namespace std;

int N; // 手指数量 
int M; // 加的数字 
int res = 0;
int mar[10005];
int arr[10005];
bool st[10005];
bool return0 = false; 

void f(int start) {
    if (return0) {
        return;
    }
    if (start > N) {
        res++;
        if (res == M + 1) { // 找到一开始的数就是一 
            for (int j = 1; j <= N; j++) {
                printf("%d ", arr[j]);
            }
            return0 = true;
        }
        return;
    }
    for (int i = 1; i <= N; i++) {
        if (!res) {
            i = mar[i];
            // 不是 out[i] = mar[i]
            // 不然后面 if 又改回来 
        }
        if (!st[i]) {
            arr[start] = i;
            st[i] = true;
            f(start + 1);
            // 恢复现场
            st[i] = false; 
        }
    }
}

int main() {
    scanf("%d%d", &N, &M);
    for (int i = 1; i <= N; i++) {
        scanf("%d", &mar[i]);
    }
    f(1);
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...