Logo zibenlun 的博客

博客

题解

...
zibenlun
2025-12-01 12:58:16
分块好啊

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2023-09-24 15:49:12

题目大意

A 题 链接

C 题 链接

在本比赛 A 题的基础上,查找第 $n$ 个符合要求的数。

模拟

根据题目我们可以找到一个暴力方法就是从头开始枚举,直到找到 $n$ 个(这样肯定会超时)。

例如 $977654321$ 这个数一定是不符合要求的,但是此时如果从个位一点点加起会稍好很多时间。所以可以看到在这个数的第二位开始就已经能判断出它不符合要求,所以我们可以用一个数组按位存储要判断的数,然后找到第一个不合法的位数,从那一位开始修改。

代码:

#include<bits\/stdc++.h>
using namespace std;
int a[15];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	int cnt=1;
	a[1]=1;
	int sum=0;
	while(sum<n){
		int flag=0;
		for(int i=1;i<cnt;i++){
			if(a[i]>=a[i+1]) {
				flag=i;
				break;
			}
		}
		if(flag) {
			a[flag]++;
			for(int i=1;i<flag;i++) a[i]=0;
			while(a[flag]>=10) {
				a[flag]-=10;
				a[++flag]++;
				cnt=max(cnt,flag);
			}
			continue;
		}
		else {
			sum++;
			if(sum==n) break;
			flag=1;
			a[1]++;
			while(a[flag]>=10) {
				a[flag]-=10;
				a[++flag]++;
				cnt=max(cnt,flag);
			}
		}
	}
	for(int i=cnt;i>=1;i--) cout<<a[i];
	return 0;
}

AC截图

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。