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


    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<<" ";
                    }
                }
            }
        }
    } 
  • 相关阅读:
    SpringBoot整合RabbitMQ
    NIO
    eclipse配置maven
    IDEA常用快捷键
    IDEA如何快速查看类中的属性和方法?
    Java之IO流
    JS判断对象是否包含某个属性
    Jquery获取链接请求的参数
    JS中indexOf的用法
    JS驼峰与下划线互转
  • 原文地址:https://www.cnblogs.com/lipu123/p/14373145.html
Copyright © 2020-2023  润新知