P1149 [NOIP2008 提高组] 火柴棒等式

题目链接:

本题比较重要的点在于判断加数的范围,即枚举的范围大小。由于题目已知 \(n \leqslant 24\),且用数字 \(1\) 拼成的数尽可能大。由于 \(1111+1=1112\) 已经用了 \(25\) 根小棒,已经超过了题目 \(24\) 根小棒的数据范围,所以上界为 \(1111\)

#include <cstdio>

int a[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int cnt;

int f(int x) {//f函数用于计算一个数需要的火柴棒根数。
	if (x == 0) return a[0];
	int ans = 0;
	while (x) {
		int b = x % 10;
		ans += a[b];
		x /= 10;
	}
	return ans;
}

int main()
{
	int n;
	scanf("%d", &n);
	n -= 4;//减去加号和等号
	
	for (int i = 0; i <= 1111; i++) {
		for (int j = 0; j <= 1111; j++) {
			int k = i + j;//这里直接计算出k的值,可以优化掉一重循环
			if (f(i) + f(j) + f(k) == n) cnt++;
		}
	}
	printf("%d", cnt);
}
posted @ 2024-03-30 16:35  胖柚の工作室  阅读(31)  评论(0)    收藏  举报