限制不互素对的排列

限制不互素对的排列

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

做这个题的时候 刚开始一看这不就是全排列吗 dfs遍历判断不就可以了吧 一看数据范围 算了
看数据范围的时候看到了一个条件0图片说明 k图片说明 n/2
最大条件是偶数的个数
又觉得每两个偶数的gcd都是大于1的
每个相邻的奇数的gcd都是1 是互素的
所以我们可不可以把偶数都排到一起 排够k+1个偶数就可以凑够k对
然后再把剩下的数字按顺序排下来 这样剩下的偶数中间都会有奇数隔开 一定是互素的
可是问题又来了 k=n/2的时候好像不够啊偶数 偶数只有(n/2)个,可是我们需要(n/2)+1个,那我们能不能把一个奇数放在一个偶数旁边呢,后来发现最小的就是3 6的gdc大于1,我们就把3放在开头 6在它后面 然后后面的数还是按这种方法排就好啦。

import java.util.*;
import java.math.*;
public class Main {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int k = input.nextInt();
        int a[] = new int[n];
        if(k==n/2)
        {
            if(n>=6)
            {
                a[0] = 3;
                a[1] = 6;
                int l=2;
                for(int i=1;i<k;i++)
                {
                    if(l*i>=6)
                        a[i+1] = l*i+2;
                    else
                        a[i+1] = l*i;
                }
                int r=1;
                for(int i=0;i<n-k-1;i++)
                {
                    if(l*i+1<3)
                        a[i+k+1] = l*i+1;
                    else{
                        a[i+k+1] = l*i+3;
                    }

                }
                for (int i = 0; i < n; i++) {
                    System.out.print(a[i]+" ");
                }
            }
            else {
                System.out.println(-1);
            }
        }
        else
        {
        int l=2;
        boolean visit[] = new boolean[n+1];
        for(int i=0;i<k+1;i++)
        {
            a[i] = l*(i+1);
            visit[l*(i+1)] = true;
        }
        int p = k+1;
        for(int i=1;i<n+1;i++)
        {
            if(!visit[i])
                a[p++] = i;
        }
            for (int i = 0; i < n; i++) {
                System.out.print(a[i]+" ");
            }
    }
}

}
全部评论

相关推荐

勤奋努力的椰子这就开摆:美团骑手在美团工作没毛病
投递美团等公司10个岗位
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
5 收藏 评论
分享
牛客网
牛客企业服务