限制不互素对的排列(构造)
https://ac.nowcoder.com/acm/contest/9981/I
链接:https://ac.nowcoder.com/acm/contest/9981/I
来源:牛客网
如果不存在可行的构造方案,输出-1。
否则输出一行 个数,用空格隔开。如果有多组可行的构造方案,输出任意一组即可。
示例2
说明
共有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<<" "; } } } } }