这是一道比较经典的将数列中的数字轮换的题目,我们先看题干:

题干分析:先浅浅地分析一下题目是要我们干什么,我们会默认有一个已经升序排序地1~n的排列,然后我们会给定一个新排列是在原有排列的基础上进行operation得到的,那么我们来看看这个operation是什么:

这个operation是对每一个位置i上进行操作的,就是对前i个数向右移动一位,并且在第i位上可以执行的operation次数是无穷的;

接下来,我们要发现题干叫我们求的是什么,他问我们能不能从初始序列经过尽可能小的operation次数到达给定的序列,我们就是要让这个数尽可能地小;

然后我们是要怎么解决这道题呢?首先我们可以发现,我是根据i的顺序从小到大逐渐把前面的顺序逐渐打乱的,说明在d[n]之前,n这个最大的数字肯定是没有动过,所以d[n]是多少纯粹是根据n被移动到了哪里决定的,因为其他的不影响n的位置,所以可根据n的位置反推出d[n],同理我们可以反推出d[n-1]……以此类推!

最后我们再来考虑一下是怎么得到d[n]的,我们通过倒着循环i,当找到n的位置为j之后,我们令ind(index)等于j,我们就知道这里换转了(ind+1)%i次

所以我们就把所有的数全部换回去,所以我们循环1~i,找到他们本来的位置换回去,这样的话,d[n]就完成了,我只要接下来完成同样的循环就好了!

因为我需要找回n个数,每次找回一个数的时间复杂度是O(n)的,所以这个算法的时间复杂度是O(n^2)

接下来是代码:

#include<bits/stdc++.h>

#define maxn 2100

using namespace std;

int q[maxn],n,b[maxn],ans[maxn];

int main()

{

int t;

cin >> t;

while(t--){

int n;

cin >> n;

for(int i = 0;i<n;i++) cin >> q[i];

for(int i = n;i>=1;i--){

int ind  = 0;

for(int j = 0;j<i;j++) ind = q[j]==i ? j : ind;

for(int j = 0;j<i;j++) b[(i+j-1-ind)%i] = q[j];

for(int j = 0;j<i;j++) q[j] = b[j];

ans[i-1] = i!=1 ? (1+ind)%i : 0;

}

for(int i = 0;i<n;i++) cout << ans[i] << " ";

cout << '\n';

}

return 0;

}

Twist the Permutation 数列的轮换题 Codeforces 776 div3的更多相关文章

  1. Codeforces #550 (Div3) - G.Two Merged Sequences(dp / 贪心)

    Problem  Codeforces #550 (Div3) - G.Two Merged Sequences Time Limit: 2000 mSec Problem Description T ...

  2. CodeForces 1029E div3

    题目链接 第一道场上自己做出来的E题...虽然是div3,而且是原题... 当时做完ABC,D题没有思路就去怼E了,然后发现貌似原题? 事实上就是原题... 给个原题链接... [HNOI2003]消 ...

  3. codeforces #579(div3)

    codeforces #579(div3) A. Circle of Students 题意: 给定一个n个学生的编号,学生编号1~n,如果他们能够在不改变顺序的情况下按编号(无论是正序还是逆序,但不 ...

  4. 套题 codeforces 359

    A题:Free Ice Cream 注意要使用LL,避免爆int #include <bits/stdc++.h> #define scan(x,y) scanf("%d%d&q ...

  5. 水题 Codeforces Round #302 (Div. 2) A Set of Strings

    题目传送门 /* 题意:一个字符串分割成k段,每段开头字母不相同 水题:记录每个字母出现的次数,每一次分割把首字母的次数降为0,最后一段直接全部输出 */ #include <cstdio> ...

  6. 水题 Codeforces Round #300 A Cutting Banner

    题目传送门 /* 水题:一开始看错题意,以为是任意切割,DFS来做:结果只是在中间切出一段来 判断是否余下的是 "CODEFORCES" :) */ #include <cs ...

  7. [刷题]Codeforces 794C - Naming Company

    http://codeforces.com/contest/794/problem/C Description Oleg the client and Igor the analyst are goo ...

  8. CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression

    题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...

  9. 水题 Codeforces Round #299 (Div. 2) A. Tavas and Nafas

    题目传送门 /* 很简单的水题,晚上累了,刷刷水题开心一下:) */ #include <bits/stdc++.h> using namespace std; ][] = {" ...

随机推荐

  1. 深入分析CVE-2021-4034及漏洞复现

    正向shell总结 一.winrm,http.sys(端口复用) 介绍 winrm WinRM全称是Windows Remote Management,是微软服务器硬件管理功能的一部分,能够对本地或远 ...

  2. 6.Flink实时项目之业务数据分流

    在上一篇文章中,我们已经获取到了业务数据的输出流,分别是dim层维度数据的输出流,及dwd层事实数据的输出流,接下来我们要做的就是把这些输出流分别再流向对应的数据介质中,dim层流向hbase中,dw ...

  3. Numpy的各种下标操作

    技术背景 本文所使用的Numpy版本为:Version: 1.20.3.基于Python和C++开发的Numpy一般被认为是Python中最好的Matlab替代品,其中最常见的就是各种Numpy矩阵类 ...

  4. 【Java分享客栈】我为什么极力推荐XXL-JOB作为中小厂的分布式任务调度平台

    前言   大家好,我是福隆苑居士,今天给大家聊聊XXL-JOB的使用.   XXL-JOB是本人呆过的三家公司都使用到的分布式任务调度平台,前两家都是服务于传统行业(某大型移动基地和某大型电网),现在 ...

  5. mysql is not null 执行效率低

    a表字段类型为int b表字段类型为varchar a left join b时如果查询条件是is not null,效率很快,is  null 效率很低 后来两者改为同类型 int,效率很高

  6. Python 随机(random)模块的不可预测之美

    1 . 概念 1.1 真.伪随机数 大部分的计算机语言都会提供 API 生成随机数,此类 API 称为随机数生成器. 计算机可以用随机数模拟现实世界中的各种随机概率问题,没有随机生成器的编程语言不是& ...

  7. [自动化]浅聊ansible的幂等

    描述   幂等性是在实际应用中经常需要考虑的概念,尤其是运维中.相较于将幂等性理解为各种异常情况的综合处理,将其理解为执行时需要考虑到在前次执行产生的影响的情况下能够正常执行则会更加容易接近业务需求. ...

  8. iOS 通知扩展插件

    iOS 通知扩展插件 目录 iOS 通知扩展插件 Notification Service Extension 新建一个target 代码实现 注意事项 UINotificationConentExt ...

  9. 【C# 线程】线程局部存储(TLS) 实战部分 ThreadStatic|LocalDataStoreSlot|ThreadLocal<T>

    往袋子里面装苹果 错误案例示范 关于C#多线程的文章,大部分都在讨论线程的起停或者是多线程同步问题.多线程同步就是在不同线程中访问同一个变量(一般是线程工作函数外部的变量),众所周知在不使用线程同步的 ...

  10. 【C# IO 操作 】详解去掉字符顺序标记(BOM)头的方法

    类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM).它是一串隐藏的字符,用于让记事本等编辑器识别 ...