A
题意
给出(n(leq nleq 100))和(k(0leq kleq n)),判断是否存在长度为(n)的排列,恰好有(k)个峰值,峰值为对于(1< i< n),(a_i>a_{i-1})并且(a_i>a_{i+1}),如果存在,输出一个这样的排列,否则输出(-1)
题解
可以使用前(k)大的数构建(k)个峰值,排列为(1,n,2,n-1,3,n-2,cdots ,k,n-k+1,k+1,k+2,cdots ,n-k)。排列存在需要满足的条件为(n-k+1>k+1),即为(2*k<n)。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int T,n,k,ans[110];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&k);
if(2*k>=n) printf("-1
");
else{
for(int i=1;i<=n;i++) ans[i]=0;
int num=n;
for(int i=2;i<=n;i+=2){
if(k==0) break;
ans[i]=num--;
k--;
}
num=1;
for(int i=1;i<=n;i++){
if(!ans[i]) ans[i]=num++;
}
for(int i=1;i<n;i++) printf("%d ",ans[i]);
printf("%d
",ans[n]);
}
}
}