题解:AT_abc382_d [ABC382D] Keep Distance

本文同步发布至洛谷

题解报告

题目翻译

可以理解为我们要输出 n n n 个数,其中两两差距必须大于等于 10 10 10。

解题思路

首先这道题的第一个数肯定要从1开始,这是没有问题的对吧。

然后我们又发现最大的 n n n 只有 12 12 12,那么我们完全可以打暴力来枚举所有的情况(注:这里要按照字典序枚举),也就是说,只要我们能够使每次所枚举的值都是有意义的就可以了。

那么怎么做呢?

这是非常简单的,我们只需要确定一个数的上下边界就可以了。

设一个数为 x x x,他的上一个数为 l a s t last last,当前为第 k k k 个数,我们不难发现:

l a s t + 10 ≤ x ≤ m − ( n − k ) × 10 last+10 \le x \le m-(n-k) \times 10 last+10≤x≤m−(n−k)×10

那么我们完全就可以直接 dfs 来枚举,并且使每次的值都是满足上述条件的就可以了。

注:这里不能直接存储下来,因为会爆空间,所以我们可以 dfs 两次,第一次求 c n t cnt cnt,第二次来枚举。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,m;
int v[20]={-9};//注意一下初值的问题
long long cnt;

void dfs1(int x){
	if (x==n+1){
		cnt++;
		return;
	}
	for (int i=v[x-1]+10;i<=m-(n-x)*10;i++){
		v[x]=i;
		dfs1(x+1);
	}
	return;
}

void dfs2(int x){
	if (x==n+1){
		for (int i=1;i<=n;i++){
			cout<<v[i]<<" ";
		}
		cout<<endl;
		return;
	}
	for (int i=v[x-1]+10;i<=m-(n-x)*10;i++){
		v[x]=i;
		dfs2(x+1);
	}
	return;
}

int main() {
	cin>>n>>m;
	dfs1(1);
	cout<<cnt<<endl;
	dfs2(1);
	return 0;
}
相关推荐
JieE21221 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2123 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2123 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050733 天前
(一)小红的数组操作
算法·编程语言