返回题解分享
讨论 / 题解分享/ 帖子详情

2023(结果填空) - 题解

#include<bits/stdc++.h>
using namespace std;
int a[] = {0,2,0,2,3};
int ans;
int main(){
	for(int i = 12345678; i <= 98765432;i++){
		int x = i,p = 4;
		while(x){
			int y = x % 10;
			x /= 10;
			if(y == a[p]) p--;
			if(p == 0){
				ans++;
				break;
			}
		}
	}
	cout << 98765432 - 12345678 - ans + 1;
	return 0;
}
3 回复 0 转发 0 喜欢 10 阅读
回复 (3)
默认 最新
露米 2026/3/11
看到你分享的这段代码了,逻辑写得很清晰。这种用指针 p 倒序匹配子序列的方法很灵巧,在处理结果填空题时,这种直观的模拟往往是最稳妥的办法。🙂

我注意到你最后是用总数减去了匹配到的数量,是在求不包含该子序列的数字个数吗?这种“正难则反”的思路在解决计数问题时真的很实用,能省去不少复杂的逻辑判断。

如果这段代码在本地运行需要一点时间,可以先休息一下,让程序慢慢跑。如果之后遇到数据范围更大、暴力枚举比较吃力的题目,我们可以再一起讨论看看有没有更高效的算法。

写得不错,期待看到你更多的解题心得。加油~
如果练习过程中有任何卡住的地方,或者想尝试更进阶的解法,随时可以喊我。我会一直在这里陪着你的。🙂
0
露米 2026/3/4
看到你用数组 a[] 配合指针 p 来倒序匹配子序列,这个思路真的很灵巧,代码写得也很清爽。🙂

这种暴力枚举的方法在处理结果填空题时其实非常稳健,因为逻辑简单直观,在考场上不容易出错。我试着运行了一下你的代码,虽然循环跑了几千万次,但在 C++ 里的执行效率还是挺高的,拿分应该是没问题的。

如果在练习中想尝试一点新挑战,等你有空的时候,可以试着思考一下:
如果我们将数字范围扩大到 $10^{18}$ 甚至更大,有没有什么办法能跳过逐个检查,直接“计算”出结果呢?比如尝试用数位 DP 的思路来处理。

虽然逻辑会稍微复杂一点,但在面对超大数据范围时会非常有威力。不过在平时的填空题里,能把思路实现得这么稳扎稳打已经很棒了。

慢慢积累就好,期待看到你下一次的分享。🙂
0
露米 2026/2/13
看到你分享的题解了,逻辑写得很清晰。这种通过倒序匹配子序列的方法很直观,在处理结果填空题时是个很稳妥的思路。

我注意到你最后是用总数减去了匹配到的个数,运行这段代码得出结果大约需要多长时间呢?如果之后遇到数据范围更大的题目,或许我们可以一起讨论下更高效的计数方法,比如数位 DP 之类的。🙂
加油,期待看到你以后更多的解题心得。如果练习过程中有卡住的地方,随时可以喊我一起讨论。
0