浅谈打表与其技巧
9098
浅谈打表与其技巧
critnos
·
2020-06-27 12:34:38
·
算法·理论
打表是啥?
打表,是一个信息学专用术语,意指对一些题目,通过打表技巧获得一个有序表或常量表,来执行程序某一部分,优化时间复杂度。这种算法也可用于在对某种题目没有最优解法时,用来得到分数的一种策略。——百度百科
因为交上去的程序运行时间有严格限制,但是本机运行则时间可以很长。所以提前用本机算出所有可能的数据的答案,拷贝到代码里。交上去的程序只用查表格就能得到答案。
这种方法适用于数据范围较小的情况。当然,本机的运行时间也要可以接受。
打表的代码,一般来说是时间可以接受,但又过不了的题目。比如跑 10^9,一般跑 10s,对于时限 1s 的测评机显然是不行的,但是本机可以。可是假如跑 2^{100} 那本机也无法在有意义的时间内跑完。
如果正解相当复杂,而打表又可以获得较高的分数甚至满分,在时间紧迫的赛场上是非常有用的。
一般来说打表分为两部分:打表程序和提交程序。
例子:P1035 级数求和
数据范围只有 [1,15] 且是正整数。所以可以写出这样的打表代码:
#include
using namespace std;
int f(int k)
{
double i=1,s=0;
while(s<=k)
{
s=s+1/i;
i++;
}
return i-1;
}
int main()
{
for(int i=1;i<=15;i++)
cout< } 运行后得到这样的结果: 2,4,11,31,83,227,616,1674,4550,12367,33617,91380,248397,675214,1835421, 怎么操作这个东西呢?拷贝到代码里。 #include using namespace std; int a[]={2,4,11,31,83,227,616,1674,4550,12367,33617,91380,248397,675214,1835421},k; int main() { cin>>k;
