打卡信奥刷题(1594)用C++实现信奥 P6994 [NEERC 2014] Joke with permutation

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值