Educational Codeforces Round 99 (Rated for Div. 2) A-F题解

A.可能的取值为\(1,10,\cdots,10^{\lfloor\log n\rfloor}\),因此答案为\(\lfloor\log n\rfloor+1\),也就是\(n\)在十进制表示下的位数.
B.考虑\(n\)是满足\(1+2+\cdots+n\ge x\)的最小\(n\),记\(s=1+2+\cdots+n\).
有三种情况:
i.\(s=x\),答案显然为\(n\).
ii.\(x+1<s<x+n\),那么可以通过替换第\(k\)个数为\(-1\),使得\(s-k-1=x\),答案为\(n\).
iii.\(s=x+1\),那么无论替换哪个数都不能使得\(s-k-1=x\),需要额外的一步\(-1\),因此答案为\(n+1\).
C.后手显然可以让自己赢\(y\)次,只要他一直不接先手发球再自己发\(y\)次球.再注意到后手其实可以接先手最后一次的发球,因此答案为\(x-1\)和\(y\).
D.如果存在\(a_i,a_j>x\)且\(i<j\),假设先把\(a_j\)替换成\(x\),那么\(a_i\)永远也不可能通过替换使得比\(x\)小.因此每次替换只能替换第一个满足条件的位置.
E.枚举四个顶点的位置关系,即在结果中分别是右上,左上,左下,右下.假设此时知道正方形边长为\(t\),那么可以对横纵坐标分别考虑,例如对横坐标需要满足\(x_0-t=x_1=x_2=x_3-t\).
这是一个经典问题:给定序列求最少总变化量使所有数相等,结论是取中位数.现在不知道\(t\)的值,但可以发现代价关于\(t\)是一个分段线性函数,因此最值一定在改变斜率的点处取得.
因此只需要枚举所有可能的\(t\),也就是所有横坐标对的差以及所有纵坐标对的差.枚举位置要\(4!\)次,枚举边长最多有\(12\)种可能,只需要枚举\(288\)次.
F.注意到每个数最多向前移动两个位置.移动两个位置的方法:第\(2\)步交换\(2\)和\(3\)变成\(132\),第\(3\)步交换\(1\)和\(3\)变成\(312\).
然后贪心考虑每一位,考虑这个位置以及接下来两个位置中如何变换可以使得这一位的值最小.如果\(3\)个位置中多个位置都能使得当前位最小,那么应该让最前面的位置变换到当前位置.
实现代码时需要记录当前位还能不能进行操作.
参考代码:https://codeforces.com/contest/1455/submission/100060216
其中p为\(1\)表示当前位置不能再操作.fm,sm,tm分别表示当前开始第\(1,2,3\)位可以变化的最小值.

上一篇:Java面向对象03:回顾方法的调用


下一篇:快/光速幂学习笔记