这一场写的还算是可以,4题过的比较快,但是后面就挂机了,那个数论没搞出来有点可惜…
Problem A
题目大意&题解
有n个block,每个block都有一定数量的员工,现在要重新分成k个block,要求每个block的员工数量相同,每次可以对相邻的block进行合并,也可以拆分一个block,问最少的操作次数。
可以注意到如果总数除不尽k的话肯定是分不了的;如果可以分,对于少的block要增加,对于多的block要减少,基于这个思想,我们从第一个block模拟到最后一个block,比标准值多久减少,比标准值少就增加(相同的话直接清零)。
感觉以前CF有过类似的题。
代码
Problem B
题目大意&题解
有n个炸弹,每个炸弹都有一个爆炸半径和爆炸代价,引爆一个炸弹会把半径范围里面未爆炸的所有炸弹引爆。问引爆所有炸弹的最小代价。
注意到炸弹爆炸的传递性,想到建图后强连通缩点,由于缩点后的图是个DAG,而且我们只用引爆入度为0的点集中代价最少的那一个就行了。所以在重新建图的时候维护度数和最少代价就行了。
###代码
Problem C
题目大意&题解
有个老司机正在飙车,他的速度是非减的,现在警察发现了他,警察有n个记录,每个记录是他在某个整点的位置,记录的位置是依次递增的,问这个老司机经过最后面一个记录点时的最短时间。
要求最短,首先最后面一段的时间肯定是1,也就是速度值等于那一段的长,然后我们从最后面一段向前模拟,每次二分找到最大的满足条件的时间,累加进答案即可。
代码
Problem F
题目大意&题解
给你一个字符串s,要你把\(+-*/\)这四个运算符依次放入,求结果的最大值。
这一题大胆猜想只可能是两个数相乘除一个两位数或者是一位数,前面的加法也一定是一个一位数加上另外一个剩下的数,这样贪心先算出减去的值,再算出前面加法的最大值,总和一下就好了。
这个贪心感觉挺容易想到的…只是不知道怎么证明(笑着哭)