首页 > 代码库 > CCPC2016杭州现场赛
CCPC2016杭州现场赛
A(hdu5933):(贪心)
题意:长度为n
的数组: a1, a2,?
, 每次操作要么可以merge两个相邻的数为一个, 值为两个数的和; 要么可以把一个数分裂成两个, 两个数的和为原数. 用最少的操作把数组变换成长度为K
且所有数值相等的数组, 无解输出-1
分析:注意到是只能合并相邻的数,那么从前往后,对于一段数,它们的和是所期望平均值的倍数时候,那么就将它们单独操作计算次数。
B(hdu5934):(强连通分量)
题意:二维平面上有 n 个炸弹,每个炸弹有个引爆的代价和爆炸半径,问至少花费多少代价才能引爆所有炸弹。
分析:将炸弹视为点,炸弹引爆信息视为边,那么就很容易想到答案就是把所有入度=0的点炸掉,但注意是可能有环的,所以要先强连通分量缩点,缩点的权值用其内部权值最小的点的权值代替,对于这个新的DAG图,把所有入度为0的点炸掉。
C(hdu5935):(贪心)
题意:有个老司机在开车, 开车过程中车的速度是不减的. 交警记录了这个老司机在n
个时间点的位置, 但是时间位置. 已知老司机从位置0出发, 记录的时间点都是整数, 问经过第n
个位置最少需要的时间.
分析:对于最后一段,时间肯定是1,再向前模拟,注意v要用分数表示才精确。
D(hdu5936):(meet in middle)
题意:f(y,K)=∑(z in every digits of y)z^K,x=f(y,K)-y,给定x和K,求y的个数
分析:按道理来说,y越大,那么f(y,K)-y的值应该是越小的,所以y不会丧心病狂的大,经过计算发现y最多只是十位数。
直接枚举y是肯定TLE,注意到题目的限制条件有两个,一个是y,一个是f(y,K),而f(y,K)只和每个数位上的数有关,所以对于一共十位数,我们可以枚举五位,十位数就是从这五位数中选两个拼接而成的。
具体的,枚举0~99999,计算f[i]-i存入数组中排序,再枚举0~99999作为高五位,如果要存在,那就希望数组中存在x-(f[i]-i*100000),存在多少就加多少个数,这就是个二分查找的过程。
O(10^6*log(10^6))
注意一个细节,就是高5位和低5位都是0的情况会算两次,所以如果0符合条件,那么结果要减去一次。
注意:1、不要用map、set,特别慢
2、不要用lower_bound(),upper_bound(),特别慢
3、手写lower,upper要细心,upper不要改变含义,就按照upper_bound()的定义写
4、手写二分的时候要在前面加入-inf,后面加入inf
4、本题要注意是0~99999而不是1~99999,同时两个0要答案减一
E(hdu5937):(dfs+剪枝)
题意: 有1~9 9个数字各有a1, a2, …, a9
个, 有无穷多的+和=. 问只用这些数字, 最多能组成多少个不同的等式x+y=z
, 其中x,y,z∈[1,9]
.
分析:一共有36个不同的等式,1个数字i,最多用17-i个,所以可以提前把多余的数量删掉,并且特判ans=36的情况
对于接下来的,再进行搜索,按照等式的取舍来搜,注意加上最优性剪枝和可行性剪枝
F(hdu5938):(预处理)
题意:给出一个长度最大是20
的数字串, 你要把数字串划分成5
段, 依次填入’+’, ’-’, ’*’, ’/’, 问能得到的最大结果.
分析:预处理一段只有加号的最大结果、只有乘号的最小结果、有乘号有除号的最小结果,再枚举减号的位置,得出最大结果。
注意:1、预处理的时候注意从哪一位到哪一位,不然会溢出
2、long long类型的inf=1e18,而不能赋值1e19……
K(hdu5943):(二分图匹配)
题意:n
个人编号为 [s+1,s+n]
,有 n
个座位编号为 [1,n]
,编号为 i
的人只能坐到编号为它的约数的座位,问每个人是否都有位置坐
分析:①若[1,n]和[s+1,s+n]不相交
注意到如果[s+1,s+n]中有两个或两个以上的素数,那么就不可解了,因为它们都只能放在1的位置,而只有一个质数的情况下,区间的长度肯定不会很长,那么就是一个二分图匹配问题了。
②若[1,n]和[s+1,s+n]相交,对于编号为[s+1,n]的这些人,他们坐在[s+1,n]上是最优的,因为如果他们坐在自己约数的座位上,那么就让后面的数坐上座位的概率减小(比如 3 9 12,如果9不坐在9上而坐在3上,那么12就没地方坐了)
于是区间匹配就成了[1,s]和[n+1,n+s]了,这就变成问题①了。
CCPC2016杭州现场赛