[USACO Training] Section 1.4

这一章的主题是枚举。

TEXT Search Techniques

搜索      时间  空间      何时使用
DFS     O(c^k)  O(k)    必须搜索整棵树,知道解所在的层数,或者不需要层次最浅的解
BFS     O(c^d)  O(c^d)  知道解所在的层次很浅,或者需要最浅的解
DFS+ID  O(c^d)  O(d)    想要BFS,却没有足够的空间,并且能承受以时间换空间
c是每层做出的选择的数目
d是解的深度
k是搜索的深度
d <= k

PROB Arithmetic Progressions

给定N、M,寻找所有长度为N的共差为正整数的等差数列,每一项均能表示成p^2+q^2,0<=p, q<=M。3<=N<=25,1<=M<=250。

百度一下,找“Arithmetic Progressions”的中文翻译,无意中瞥到一个题解,说用最笨的方法AC了。于是我一直在想什么方法最笨……

首先打一个表,把p^2+q^2枚举出来,存到STL map里。map维护数到以该数结尾的合法等差数列的最大长度的映射。每次搜索公差为d的等差数列(一是因为这样方便,二是因为题目要求以公差为第一关键字排序输出),遍历这个map递推即可。用最大的数据测试了一下,等了好长时间都没出解。题目中有一个条件:数列的个数不超过10000。也许数据是专门构造的,我这样可行?于是加上找到10000个就退出。提交,TLE。

本机测试了一下,要10多秒。开O2,4秒多,看起来可以卡过去的样子,然而这个OJ不开O2……据说O2能大幅度提升STL的性能,所以可能是map比较慢。换成排序+二分。快了一些,可是还是会T。突然醒悟:“前一项”在顺序遍历时具备单调性!所以两个指针扫一遍即可,砍掉一个log。AC。

看ANALYSIS。我好像忽略了本题p^2+q^2值域很小这个特性……测了一下第2个解答,为什么人家的复杂度比我差跑得却比我快?QAQ

/*
ID: chrt2001
PROG: ariprog
LANG: C++
*/
#include <cstdio>
#include <algorithm>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值