社区讨论

送上答案表和打表源码

P1149[NOIP 2008 提高组] 火柴棒等式参与者 18已保存回复 17

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
17 条
当前快照
1 份
快照标识符
@mi7d19vl
此快照首次捕获于
2025/11/20 19:40
4 个月前
此快照最后确认于
2025/11/20 22:07
4 个月前
查看原帖
我是蒟蒻,打表都用掉了两秒的时间(呜呜呜)(不过用 -O100 可以优化到0.1s)
先上答案:
CPP
#include <bits/stdc++.h>
using namespace std;

int ans[30];

int main()
{
	ans[0] = 0;
	ans[1] = 0;
	ans[2] = 0;
	ans[3] = 0;
	ans[4] = 0;
	ans[5] = 0;
	ans[6] = 0;
	ans[7] = 0;
	ans[8] = 0;
	ans[9] = 0;
	ans[10] = 0;
	ans[11] = 0;
	ans[12] = 0;
	ans[13] = 1;
	ans[14] = 2;
	ans[15] = 8;
	ans[16] = 9;
	ans[17] = 6;
	ans[18] = 9;
	ans[19] = 29;
	ans[20] = 39;
	ans[21] = 38;
	ans[22] = 65;
	ans[23] = 88;
	ans[24] = 128;
	ans[25] = 192;
	ans[26] = 319;
	ans[27] = 454;
	ans[28] = 624;

	int n;
	cin >> n;
	cout << ans[n] << endl;
	return 0;
}
然后是打表
CPP
#include <bits/stdc++.h>
using namespace std;

const int maxSearch = 1000;
const int c[] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int dp[maxSearch + 5];

inline int getValue(int n)
{
	return dp[n] ? dp[n] : (dp[n] = (n < 10) ? c[n] : getValue(n / 10) + getValue (n % 10));
}

int main()
{
	int n;
	cin >> n;
	n -= 4;
	
	for (int k = -4; k < 25; ++k)
	{
		printf("ans[%d] = ", k + 4);
		int cnt = 0;
		for (int i = 0; i < maxSearch; ++i)
			for (int j = 0; j < maxSearch; ++j)
				if (getValue(i) + getValue(j) + getValue(i + j) == k)
					++cnt;
	printf("%d;\n", cnt);
	}
	return 0;
}

回复

17 条回复,欢迎继续交流。

正在加载回复...