题解 CF1716B

题解 CF1716B

这是一个纯纯的构造题

我们要构造 n 个序列,每个序列他的元素 \(a_i\) 在第 i 个位置上的数量都应该比上一个序列的数量

并且这种序列只能通过交换两个数字来获取

所以,我们应该直接每次找到两个不同的数字,直接交换即可

这里的第一次我们直接输出原序列

然后每次循环找与下标不同的元素

因为如果是找到的第一个,肯定不能交换,因为这是第一个,我们可以没有与他交换的其他元素

这里特判一下就行了

#include<cstdio>
#include<string.h>
using namespace std;
int T;
int a[110];
void Swap(int &x,int &y){
	int t=x;
	x=y;
	y=t;
	return ;
}
int main(){
	scanf("%d",&T);
	while(T--){
		memset(a,0,sizeof(a));
		int n;
		scanf("%d",&n);
		printf("%d\n",n); 
		for(int i=1;i<=n;i++){
			a[i]=i;
			printf("%d ",i);
		}
		puts("");
		int f=0;
		for(int k=1;k<=n;k++){
			for(int i=1;i<=n;i++){
				if(a[i]==i && !f){
					f=i;
				}else if(a[i]==i && f){
					Swap(a[f],a[i]);
					for(int i=1;i<=n;i++){
						printf("%d ",a[i]);
					}
					puts("");
				}
			}
		}
	}
	return 0;
}
posted @ 2022-11-30 09:15  Tyrue  阅读(10)  评论(0编辑  收藏  举报