小清新分讨题:CF2031C

zhangzirui66

2024-11-15 22:57:09

Solution

小小的分讨题。

偶数

如果 n 为偶数,输出 1 1 2 2 3 3 \dots,每组间隔均为 1

奇数

如果 n 为奇数,上面的方法会多出一个,考虑改造算法。

由于允许有两个以上同种面包,我们可以放置 31 号面包,剩下总数仍为偶数,如上即可。

三个面包的位置不能乱放。设第一个 1 号面包的坐标为 x,第二个为 y,第三个为 z,就要满足:

终于结束了吗?没有,第一和第二个 $1$ 号面包间隔 $8$ 格,能填充满,但第二和第三个之间间隔 $15$ 格,填不满。那该怎么办? 为什么一定要放里面呢?我们可以拆开一组,一个放里面,一个放外面,就填满了。 ### 代码时间: ```cpp #include<bits/stdc++.h> using namespace std; int t, n; int main(){ cin >> t; while(t --){ cin >> n; if((n & 1) && (n < 27)){//下面的表长 27 个数字,不够就无解 cout << "-1\n"; } else if(n & 1){ cout << "1 2 2 3 3 4 4 5 5 1 6 6 7 7 8 8 9 9 10 10 11 11 13 12 12 1 13 ";//注意拆掉 13,使其刚好填满 for(int i = 14; i * 2 <= n; i ++) cout << i << " " << i << " ";//接着 14 填 cout << "\n"; } else{ for(int i = 1; i * 2 <= n; i ++) cout << i << " " << i << " ";//偶数直接填 cout << "\n"; } } return 0; } ```