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;//好习惯
}
posted @ 2023-12-23 09:52  shixuanbin  阅读(40)  评论(0)    收藏  举报