小清新分讨题:CF2031C

小小的分讨题。

偶数

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


奇数

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

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

三个面包的位置不能乱放。设第一个 11 号面包的坐标为 xx,第二个为 yy,第三个为 zz,就要满足: xy\lvert x-y \rvertyz\lvert y-z \rvertxz\lvert x-z \rvert 均为完全平方数,且 xy+yz=xz\lvert x-y\rvert+\lvert y-z \rvert=\lvert x-z \rvert,这东西不就是勾股定理吗!于是用最小的勾股数的平方当它们的间隔即可。

终于结束了吗?没有,第一和第二个 11 号面包间隔 88 格,能填充满,但第二和第三个之间间隔 1515 格,填不满。那该怎么办?
为什么一定要放里面呢?我们可以拆开一组,一个放里面,一个放外面,就填满了。

代码时间:

#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;
}

posted on   zhangzirui66  阅读(3)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示