自从做USACO以来,给我留下深刻印象的一直都是这种题目:方法不难找到,但是需要细节的优化,否则超时。
fracdec这个题目我没有用特别的数学技巧,只是简单的模拟除法运算,记录重复的余数等等。
从第一次提交超时到最后通过,共做了两次优化,第一次是使用bitset记录曾经出现的余数,将余数搜索的时间性由O(n)降到了O(1);
第二次就是去除了中间结果的记录,起初我将中间数字存储到一个stringstream中,最后再将完整的结果写入文件,后来我觉得这样没有必要,完全可以直接写入文件,但我没想到的是这样做的效果立竿见影,使得原来超时1.5秒的程序降到了0.05秒。这对我的震撼是很大的,而且我现在依然想不通为什么中间多写一些内存会导致程序慢这么多,或者是因为stringstream的效率比较低吗?看来,以后在写程序时,一定要尽量减少中间步骤,尤其是大数据量的处理时;
USACO的征程还在继续,focus!
www.xingrong0804.com
浙公网安备 33010602011771号