我踩过的坑
-
对于数字 \(i\),若 \(i\) 为奇数,则数字 \(i\) 两次出现位置之差 必须 超过 \(d\)。
-
对于数字 \(i\),若 \(i\) 为偶数,则数字 \(i\) 两次出现位置之差 不能 超过 \(d\)。
第一句的要求是:两个出现位置之差要 \(> d\)。
而第二句的要求是:两个出现位置之差 \(\le d\)。
思路
-
判断有无解:把整个串过一遍,遇到单数 \(+1\),双数 \(+2\), 如果 $d \le $ 这个结果,那就无解,否则有解
-
有解:前面和后部放单数,中部放成对的双数,如:
1 3 2 2 1 3
。
代码
#include<bits/stdc++.h>
using namespace std;
int n,d;
int f(){
int size=0;
for(int i=1;i<=n;i++)
if(i%2==1) size++;
else size+=2;
return size;
}//用来遍历串的函数,用于判断是否有解。
int main(){
cin>>n>>d;
if(d>=f()){
cout<<-1;return 0;
}//判断是否有解,若没有则直接输出 -1 并退出。
for(int i=1;i<=n;i+=2) cout<<i<<" ";//先输出单数。
for(int i=2;i<=n;i+=2) cout<<i<<" "<<i<<" ";//再输出双数,成双成对。
for(int i=1;i<=n;i+=2) cout<<i<<" ";//最后再输出单数。
return 0;
}