给出\(n(\leq n\leq 100)\)和\(k(0\leq k\leq 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\n");
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\n",ans[n]);
}
}
}
原文:https://www.cnblogs.com/fxq1304/p/14664549.html