NC19925. [CQOI2012]编号
描述
输入描述
第一行为整数k。
输出描述
输出第k小的编号(字母必须输出小写)。输入保证这个编号存在。
示例1
输入:
20
输出:
0001321
C++(clang++ 11.0.1) 解法, 执行用时: 659ms, 内存消耗: 12108K, 提交时间: 2023-01-20 21:25:10
#include <bits/stdc++.h> using namespace std; char s[20] = "0123456789abcdef"; int cnt, k; bool dp[22][17][17][17][17][17]; array<int, 7> tmp, v, C[22]; void dfs1 (int t, int d) { if (d >= 5) { C[cnt++] = tmp; return ;} for (int i = t; i < 7; i++) { tmp[d] = i; dfs1 (i + 1, d + 1); } } void dfs2 (int d) { if (k == 0) return ; if (d >= 7) { for (int i = 0; i < cnt; i++) { if(dp[i][tmp[C[i][0]]][tmp[C[i][1]]][tmp[C[i][2]]][tmp[C[i][3]]][tmp[C[i][4]]]) return ; } for (int i = 0; i < cnt; i++) { dp[i][tmp[C[i][0]]][tmp[C[i][1]]][tmp[C[i][2]]][tmp[C[i][3]]][tmp[C[i][4]]] = 1; } if (--k == 0) { for (int i = 0; i < 7; i++) cout << s[tmp[i]]; } return ; } for (int i = 0; i < 16; i++) { tmp[d] = i; dfs2 (d + 1); } } void solve() { cin >> k; dfs1 (0, 0); dfs2 (0); } signed main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); solve(); return 0; }