列表

详情


NC50517. 数字游戏

描述

科协里最近很流行数字游戏。某人命名了一种不降数,这种数字必须满足从左到右各位数字成小于等于的关系,如123,446。现在大家决定玩一个游戏,指定一个整数闭区间[a,b],问这个区间内有多少个不降数。

输入描述

有多组测试数据。每组只含两个数字a,b,意义如题目描述。

输出描述

每行给出一个测试数据的答案,即[a,b]之间有多少不降数。

示例1

输入:

1 9
1 19

输出:

9
18

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 2ms, 内存消耗: 376K, 提交时间: 2020-10-19 17:16:39

#include <iostream>
#include <cstring>
using namespace std;
int dp[32][10], digit[32], len;
int dfs(int pos, int pre, bool up) {
	if(!pos)	return 1;
	if(!up&&dp[pos][pre]!=-1)	return dp[pos][pre];
	int ret=0,upmax=up?digit[pos]:9;
	for(int i=0; i<=upmax; i++) {
		if(i<pre)continue;
		ret+=dfs(pos-1,i,up&&i==upmax);
	}
	if(!up)return dp[pos][pre]=ret;
	return ret;
}
int solve(int x) {
	len = 0;
	memset(dp, -1, sizeof(dp));
	while (x) {
		digit[++len] = x % 10;
		x /= 10;
	}
	return dfs(len, 0, true);
}
int main() {
	int a, b;
	while (cin >> a >> b) {
		cout << solve(b) - solve(a-1) << endl;
	}
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 328K, 提交时间: 2023-02-18 14:49:46

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll a,b,ans;

void dfs(ll u,ll c)
{
	if(u>b) return;
	else if(u>=a) ans++;
	for(int i=c;i<10;i++)  dfs(u*10+i,i);
}

int main()
{
	while(cin >> a >> b){
		ans=0;
        dfs(0,1);
		cout << ans << endl;
	}
	return 0;
} 

上一题