P6994 [NEERC 2014] Joke with permutation
题目描述
Joey 在一个文本文件中保存了一个从 1 1 1 到 n n n 的整数排列。所有的数字都以十进制数字的形式书写,没有前导空格。
然后 Joe 开了个玩笑:他把文件中的所有空格都去掉了。
帮助 Joey 恢复 Joe 玩笑后的原始排列!
输入格式
输入文件包含一行,一个字符串——去掉空格后的 Joey 的排列。
Joey 的排列至少有 1 1 1 个,最多有 50 50 50 个数字。
输出格式
在输出文件中写出恢复后的排列。不要忘记空格!
如果有多个可能的原始排列,输出其中任意一个。
输入输出样例 #1
输入 #1
4111109876532
输出 #1
4 1 11 10 9 8 7 6 5 3 2
说明/提示
时间限制:1 秒,内存限制:256 MB。
感谢检查者提供者:@Arcturus1350。
题面翻译由 ChatGPT-4o 提供。
C++实现
#include <iostream>
#include <cstring>
using namespace std;
string s;
int a[60], b[60] = {1}, n;
void dfs(int it, int x) {
if (x >= n ) {
for (int i = 0; i < n; i ++) {
cout << a[i] << ' ';
}
exit(0);
}
if (it >= s.size()) return;
if (!b[s[it] ^ 48]) {
a[x] = s[it] ^ 48;
b[s[it] ^ 48] = 1;
dfs(it + 1, x + 1);
b[s[it] ^ 48] = 0;
}
if (it < s.size() - 1 && !b[(s[it] ^ 48) * 10 + (s[it + 1] ^ 48)] && (s[it] ^ 48) * 10 + (s[it + 1] ^ 48) <= n) {
int y = (s[it] ^ 48) * 10 + (s[it + 1] ^ 48);
a[x] = y;
b[y] = 1;
dfs(it + 2, x + 1);
b[y] = 0;
}
}
int main() {
cin >> s;
n = s.size() <= 9 ? s.size(): 9 + (s.size() - 9)/2;
dfs(0, 0);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P6994 NEERC 2014 Joke with permutation&spm=1001.2101.3001.5002&articleId=148987688&d=1&t=3&u=83b372fd11cd41979436f187642c4f4e)

被折叠的 条评论
为什么被折叠?



