1 条题解

  • 0
    @ 2025-8-24 23:14:53

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar fish_love_cat
    「要毁灭世界,根本不需要邪恶。起初,那些都是不会被任何人怪罪的小小愿望。而那样的愿望却如此轻易地,和末日相连在一起。」

    搬运于2025-08-24 23:14:53,当前版本为作者最后更新于2025-04-26 19:35:13,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Upd:改了一些胡言乱语的部分,比如倒闭了。

    整场最简单的。


    注意到最后剩下的一定是整个数列的平均值。

    由于是一个排列,所以要得到这个值最简单的一个方法是让第 ii 大值和第 ii 小值取平均。

    于是我们把第 ii 大值和第 ii 小值两两分组,在选中过程中整组整组的选即可。

    但是当 mm 是奇数时注意到会多出一位,此时选择的只能是数列的平均值,否则值会取错。然而如果数列平均值为小数不在序列中,那就无解。

    还有就是反复选中显然不会有什么影响,本题不需要最小化步数,所以怎么构造都是对的。

    还有一种无解的情况是 m=1m=1,判掉即可。

    代码易于实现。

    #include<bits/stdc++.h>
    using namespace std;
    void solve(){
        int n,m;
        cin>>n>>m;
        if(n==1){
            puts("0");
            return;
        }
        if(m==1){
            puts("-1");
            return;
        }
        if(!(n&1)&&(m&1)){
            puts("-1");
            return;
        }
        int flc=(n-m)/2+1;
        cout<<flc<<'\n';
        for(int i=1;i<=flc;i++){
            if(m&1)cout<<n/2+1<<' ';
            for(int j=2;j<=m;j+=2)
                cout<<j/2+i-1<<' '<<n+1-(j/2+i-1)<<' ';
            puts("");
        }
    }
    signed main(){
        int t;
        cin>>t;
        while(t--)
            solve();
        return 0;
    }
    
    • 1

    信息

    ID
    11338
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者