代码源集训复盘
Day6(7.26):构造题单

拿到一个首A非常爽。(为啥大家构造这么强????)
A Gym - 105911M
思维有点绕。
-
结论: k k k 个不翻转放入 1 1 1,余下翻转并放入 2 2 2。(也可以 x x x 个翻转放入 1 1 1,余下不翻转放入 2 2 2)
-
证明:设放入第一堆的有 x x x 个一开始被翻转,则第二堆中一开始就有 k − x k-x k−x 个一开始被翻转。
进行结论中的操作后,第一堆有 k − x k-x k−x 个背面朝上,而第二堆中也有 k − x k-x k−x 个背面朝上。
得证。
int n,k;
signed main(){
read(n,k);
for(int i=1;i<=k;i++)
cout<<1;
for(int i=1;i<=n-k;i++)
cout<<4;
return 0;
}
B Gym - 105615D
首A,爽!(因为题目说先做这个)
符合题目名字的通过人数。
-
结论:先从小到大输出所有偶数后从小到大输出所有奇数。
-
证明:因为题目要使 ∑ i = 1 n − 1 gcd ( a i + 1 , a i + 1 ) \sum_{i=1}^{n-1} \gcd (a_i+1,a_{i+1}) ∑i=1n−1gcd(ai+1,ai+1) 最小,所以每一个 gcd ( a i + 1 , a i + 1 ) \gcd (a_i+1,a_{i+1}) gcd(ai+1,ai+1) 都要最小。容易知道,相邻两个自然数的最大公因数总是为 1 1 1。所以,当把所有偶数放一起,奇数放一起时是最优的。而在偶数与奇数交界处,为 2 n 2n 2n 和 1 1 1, gcd \gcd gcd 必然为 1 1 1。
讲一下如何获得首A:观察样例易得,偶数在前奇数在后,随便一试就过了。
void sol(){
int n;
read(n);
for(int i=2;i<=n;i+=2)
cout<<i<<' ';
for(int i=1;i<=n;i+=2)
cout<<i<<' ';
cout<<endl;
}
C Gym - 105486L
构造一百个数,前 50 50 50 个放 A A A,后 45 45 45 个放 B B B,再后 4 4 4 个放 C C C,最后放 1 1 1 个 C + 1 C+1 C

最低0.47元/天 解锁文章
139

被折叠的 条评论
为什么被折叠?



