擦擦落灰的博客

遣返了

提前开始放寒假,其实还没有总结一下惨痛的XCPC初体验,打得不好,但是好在还有一年。好像落了挺多题解没写的,算了,想的起来就更新一下吧,回看之前的题解已经看不懂我在写什么了(怎会如此)。依旧不放代码了,简写一下思路。

cf-Incinerate

题意:一群怪物有生命值h和力量p,可以对他们进行攻击,每次攻击,每个怪物都会掉k的生命值,但是接下来在剩下活着的怪物里会对k起到一个反作用,使得k减小(还活着怪物里面p的最小值),问是否能消灭所有的怪物。

求解:这题的关键就是要提前走一遍,先排序(因为依据题意一定是生命值小的先挂,所以可以排序),然后记录下区间内最小的p,每次k的减小就直接查询p就行。不难,但是感觉我好像还没有那个意识去用空间换时间,写法整体还是很暴力的。

cf-Another Array Problem

题意:一个数列,可以进行以下若干次操作:选下标i,j,使得在ai到aj之间的所有元素变成aiaj|ai−aj|,问最后数列中所有元素和的最大值。

求解:结论题。因为可以进行多次操作,并且第一次更新一个区间之后都变成一样的数了,第二次再进行操作就会全变成0了。所以可以利用来回的操作使得数字变成0,再和数列中的最大值进行操作,可以使得所有数字都变成最大值。但是n==2n==2n==3n==3的时候没法来回处理。n==3n==3的时候,如果最大值在中间,两边只有一个数,是没有办法进行上述操作的,所以就要枚举一下情况进行比较a[0]+a[1]+a[2],abs(a[0]a[1])3,abs(a[1]a[2])3,abs(a[0]a[2])3,a[0]3,a[2]3{a[0]+a[1]+a[2],abs(a[0]-a[1])*3,abs(a[1]-a[2])*3,abs(a[0]-a[2])*3,a[0]*3,a[2]*3}
C++20支持写max(a,b,c,d)max({a,b,c,d})来比较多个数的大小。