限制不互素对的排列(构造)

https://ac.nowcoder.com/acm/contest/9981/I

 

链接:https://ac.nowcoder.com/acm/contest/9981/I
来源:牛客网

如果不存在可行的构造方案,输出-1。
否则输出一行 个数,用空格隔开。如果有多组可行的构造方案,输出任意一组即可。
 
示例1

输入

复制
2 1

输出

复制
-1

说明

长度为2的排列有2个:{1,2}和{2,1},显然都不符合题意
示例2

输入

复制
6 3

输出

复制
5 3 6 2 4 1

说明

共有3对相邻数不互素:{3,6}、{6,2}和{2,4}。
这并不是唯一解,只要构造任意合法解即可。
 
 
 
注意k的范围正好是n/2,而且在1-n正好有n/2个偶数,要注意特判一下-1的情况
 
 
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+100;
int vis[maxn];
int main(){
    int n,k;
    cin>>n>>k;
    if(n<=3){
        if(k==0){
            for(int i=1;i<=n;i++){
                cout<<i<<" ";
            }
        }
        else{
            cout<<-1<<endl;
        }
    }
    else if(n<=5){//1 2 3 4//1 2 4 3
        if(k==0){
            for(int i=1;i<=n;i++){
                cout<<i<<" ";
            }
        }
        else if(k==1){
            cout<<"1 2 4 3";
            if(n==5){
                cout<<" 5";
            }
        }
        else{
            cout<<-1<<endl;
        }
    }
    else{//2 4 6 3
        if(k==0){
            for(int i=1;i<=n;i++){
                cout<<i<<" ";
            }
        }
        else if(k==1){
            cout<<"1 3 2 4 ";
            for(int i=5;i<=n;i++){
                cout<<i<<" "; 
            }
        }
        else if(k==2){
            cout<<"4 1 3 6 2";
            cout<<" 5";
            for(int i=7;i<=n;i++){
                cout<<i<<" ";
            } 
        }
        else{
            cout<<"3 6 2 4 ";
            vis[3]=vis[6]=vis[2]=vis[4]=1;
            int z=k;
            k-=3;
            for(int i=8;i<=n&&k>0;i+=2,k--){
                vis[i]=1;
                cout<<i<<" "; 
            }
            cout<<"1 ";
            vis[1]=1;
            for(int i=1;i<=n;i++){
                if(!vis[i]){
                    cout<<i<<" ";
                }
            }
        }
    }
} 

 

 

posted @ 2021-02-04 16:04  lipu123  阅读(73)  评论(0编辑  收藏  举报