题解: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;
}
相关推荐
UIU1142 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
旖旎夜光2 小时前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
像风一样自由20202 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
D e re k ZH2 小时前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
Nuanyt2 小时前
LeetCode Hot 100 链表专题2 3 题 (Java)
java·笔记·算法·leetcode·链表
海绵宝宝转agent3 小时前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
青少儿编程课堂3 小时前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
SZYSK4 小时前
OpenHarmony 上读卡、推理和双屏刷新抢 CPU:核验机与消费机的调度差
物联网·算法·harmonyos·1024程序员节
Ivanqhz4 小时前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节