Educational Codeforces Round 133 (Rated for Div. 2) B. Permutation Chain

Problem - B - Codeforces

题意:

定义数列的不动点数为满足a[i]=i的数

给你一个n,要你构造出几个排列,使得这些排列相邻之间不动点数是严格递减的

思路:

构造题,构造题就是要找出满足条件的最特殊的情况

这里有个小小的贪心:

我们要让我们构造出来的排列尽可能多,第一个数列一定是1到n排列的,然后我们让后面的排列的不动点数一点一点地递减

观察样例的性质可知:排列的个数可以多达n个,因此我们猜想构造出来的排列数最多是n个

要让排列数最多为n个,注意到第二个排列的不动点数只能比第一个排列少2个

然后让后面几个排列的不动点数不断-1,就能达到n个了

那么怎么做到不动点数不断-1呢?观察样例可知,只需交换最后一个数和前面第i个数即可

Code:

#include <bits/stdc++.h>
using namespace std;
const int mxn=1e2+10;
int a[mxn];
void solve(){
    int n;
    scanf("%d",&n);
    printf("%d\n",n);
    for(int i=1;i<=n;i++) printf("%d%c",i,i==n?'\n':' '),a[i]=i;
    for(int i=1;i<=n-1;i++){
        swap(a[i],a[n]);
        for(int j=1;j<=n;j++) printf("%d%c",a[j],j==n?'\n':' ');
    }
}
int main(){
    int T=1;
    scanf("%d",&T);
    while(T--){
        solve();
    }
    return 0;
}

总结:

1.构造题就是要找出满足条件的最特殊的情况

2.要不断观察样例的性质和题目条本身的性质

3.做的时候记得把所有的思路用笔记录下来,思路一定要清晰,心里一定要冷静(想着开摆就好了)然后实在撞遍所有的思路都做不出来就可以看样例手算开始找题目的一些规律啦~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值