CF1914B Preparing for the Contest 题解
题目大意:
输入 $t$ 组数据,每行包括序列长度 $n$ 与后一个数比前一个数大的次数 $k$,要我们构造一个后一个数比前一个数大的次数为 $k$ 的序列并输出。
解题思路:
我们可以试着举一个较简单的例子,如当 $n=6$,$k=2$ 时,可以有 4 5 6 3 2 1 。这个序列满足上面的条件,还可以进行归纳:
- 令此序列为 $a$
- 从左往右数 $1\sim k+1$ 个数,满足 $a_{i}<a_{i+1}$
- 从左往右数 $k+2\sim n$ 个数,满足 $a_{i}>a_{i+1}$
- 全序列中,$a_{1}= a_{k+2}+1$
但是,$k=0$ 时此归纳就不满足了,所以在写的时候要特判。
顺着归纳的式子,便可以轻松码出来啦!
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,t;
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>n>>k;
if(k==n-1)
{
for(int j=1;j<=n;j++)
cout<<j<<" ";
cout<<endl;
}
else if(k==0)//特判
{
for(int j=n;j>=1;j--)
cout<<j<<" ";
cout<<endl;
}
else
{
for(int j=n-k;j<=n;j++)//递增
{
cout<<j<<" ";
}
for(int j=n-k-1;j>=1;j--)//递减
{
cout<<j<<" ";
}
cout<<endl;
}
}
return 0;//好习惯
}

浙公网安备 33010602011771号