题解: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;
}
相关推荐
遥感知识服务2 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶2 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆3 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
叩码以求索5 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
北风toto6 小时前
中缀、前缀、后缀表达式
算法·软件设计师
听取WA声一片(无恶意)6 小时前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
码流怪侠6 小时前
2026年8月GitHub热榜深度拆解:Agent Skills席卷开源圈,一个“技能包“收割5万星
算法·程序员·github
hold?fish:palm6 小时前
30 两两交换链表中的节点
数据结构·算法·链表
Nil2087 小时前
leetcode 98验证二叉搜索树
算法·leetcode·职场和发展
不正经学生7 小时前
C语言结构体:自定义数据类型,让变量打包出行
java·c语言·开发语言·数据结构·算法