P7957 题解

· · 题解

题目传送门

思路

由于最长单调子序列最长为 k,所以我们可以每次构造 k 个的序列,先输出前面的 k 个数字,剩下的数字一直到 n 紧接着输出完。

但是每次构造 k 个,再构造 k 次也达不到 n,所以在 k^2<n 时答案是无解的。

AC CODE

#include<bits/stdc++.h>
using namespace std;
int n,k;
int main(){
    scanf("%d%d",&n,&k);
    if((long long)k*k<n)//注意判断无解的时候会炸int
        return printf("-1"),0;
    for(int i=n;i>=k;i-=k)//每次构造k个的序列
        for(int j=k;j>=1;--j)
            printf("%d ",i-j+1);
    for(int i=1;i<=n%k;++i)//剩下的数字紧接着输出完
        printf("%d ",i);
    return 0;
}