【BJOI 2014】总结

今天做的这一套题是“北京市信息学集训队结业考试”=。=

题目难度实际上不算是太难,考场上得190分虽然不算太低,但说高也离高分层有点差距(题解给的一等线是220分)。


第一题:Coin

考察算法:动态规划

这一道题和USACO题库里面的一道题“麦香牛块”有点相似,而基本思路也是大致相同的。

题目大意是给出n个数,问用这些数凑成总和为T的最少使用个数是多少。

首先设F[i]表示凑成总数为i的最少数量,那么显然有| F[i] - F[i + a[j]] | <= 1。既然有这样一个性质,那么我猜想在计算若干个F[i]的值后,F数组会渐趋稳定。

这里的稳定的定义是,从某一个位置开始往后的位置p,其最优决策的位置都是p - max(a[i])。形象地来说,就是从某一位置开始连续max(a[i])个都“移”后了并加一。

实际上,如果n个数的最大公约数为1时,这个数组一定会稳定。但是貌似题解里面给出的计算达到A[Max]^2后数组就会稳定的说法不科学。

有一个更科学的做法。显然填充更多的A[Max]是更有利的。我们可以假设w=a[Max], T = kw + b ,b是由非A[Max]的数凑成的。那么我们可以设F[i]表示用非a[Max]的数凑成的和,模A[Max]后余i的需要的最少的数量是多少。那么将这一个数组计算N次后,显然可以得出可达到的i的值的最优解。再凑上w,就可以得出答案。这个做法的时间复杂度是O(n^2*a[Max])。


第二题:Euler

考察算法:数论、动态规划

题目大意是给出Phi(n)的值Y,求n的最小值。

做这一道题首先要对Phi函数有一定的认识。

Phi(n) = n ×  ∏ (1 - 1 / pi) = n ×  ∏ (pi - 1) / pi =  ∏ pi^(ci-1) × (pi - 1)

那么,我们就可以从Y的约数下手。显然对于n的每一个质因数p,(p - 1)必定是Y的约数。那么我们找出所有满足 (p - 1) | Y 的质数p。

然后问题就转化为了求每一个可能的p的指数。

设F[i][S]表示当前做到第i个质数,当前的Phi值凑到为S的最小的n值为多少。那么F[i][S × (a[i] - 1) × a[i]^C]可以由a[i][S] × a[i] ^ (C + 1) 转移。

但是这里的S值的范围达到了1E12。

仔细观察可以发现,可以被转移到的S值必定是Y的约数,而1E12范围内的数,每个数的约数最多只有7000个,稍微离散化一下,然后用滚动数组就可以了。

【这一道题里面对第二维的压缩的技巧使得时间复杂度与空间复杂度大大减小,是需要掌握的】


第三题:Triple

考察算法:统计

题目大意是给出一个数列,计算其中的每一位i,能在i前面D个位置找到三个位置j, k, l(可以相同),满足a[i] = a[j] + a[k] + a[l] 的三元组(j, k, l)的个数有多少。

这一道题其实并不难。但我一开始以为每一位i前面的D都是不同的,于是就想到主席树去了。但这里的D是固定的,那么每一次i的增加只会使三元组的取值范围挪动一格。

除了枚举i以外,我们再枚举一个位置j,问题就变成了,在常数时间内找到有多少对的(j, k)使得a[j] + a[k] = a[i] - a[j]。这里的a的取值范围绝对值不超过1E6,直接开数组解决就可以了。

但是这里还有一个小细节,当存在一个三元组(j, j, j)或者是(j, j, k)时,他们只会被分别计算1次和2次,但如果三个位置都不同的三元组是会被计算三次的。为了解决这个问题,再记录一个数组h[i]表示可选范围有多少个数为i,补上h[a[i] - a[j] - a[j]],对于a[j] * 3 == a[i] 的再补一次就可以了。最后总和除三就是答案。

这一次比赛第二题一分没得毕竟是硬伤。但是吸取了前几次的教训,较多的时间都用来拍一、三题了,事实也证明了这是正确的(第一题一开始暴力的范围远远不够、第三题一开始没有排除位置重复的情况)。

但遇上数论题目没有头绪也是硬伤,赶紧切数论专题找点灵感吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值