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

题干分析:先浅浅地分析一下题目是要我们干什么,我们会默认有一个已经升序排序地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. 500行代码了解Mecached缓存客户端驱动原理

    原创不易,求分享.求一键三连 缓存一般是用来加速数据访问的效率,在获取数据耗时高的场景下使用缓存可以有效的提高数据获取的效率. 比如,先从memcached中获取数据,如果没有则查询mysql中的数据 ...

  2. springBoot-启动原理

    注:SpringBoot版本 2.6.2 SpringBoot的入口是从SpringApplication.run()传入我们的主启动类开始 @SpringBootApplication public ...

  3. 黑客高端de浏览器使用秘籍

    搜索引擎已经成为上网必不可少的工具之一,聪明的黑客们发现,搜索引擎也能成为发动网络攻击的工具. Google Hacking,原指利用Google搜索引擎搜索信息来进行入侵的技术和行为,如今已不再局限 ...

  4. 每日一题:codeforces题解

    题目 B. Peculiar Movie Preferences time limit per test 2 seconds memory limit per test 512 megabytes i ...

  5. DDD与数据事务脚本

    DDD与数据事务脚本 扯淡 相信点进来看这篇文章的同学,大部分是因为标题里面的"DDD"所吸引!DDD并不是一个新技术,如果你百度一下它的历史就会知道,实际上它诞生于2004年, ...

  6. Wireshark教程之统计功能

    实验目的 1.工具介绍 2.主要应用 实验原理 Wireshark的原名是Ethereal,新名字是2006年起用的.当时Ethereal的主要开发者Gerald决定离开他原来供职的公司NIS,并继续 ...

  7. [旧][Android] View 工作原理(二)

    备注 原发表于2016.05.27,资料已过时,仅作备份,谨慎参考 前言 本文大量参照<Android 开发艺术探索>及参考资料的内容整合,主要帮助自己理清 View 的工作原理.深入学习 ...

  8. Internet/Custom路由配置——网络测试仪实操

    一.测试说明以及功能原理 本文主要介绍Internet/Custom路由配置方法以及实验: ◆作用:可以通过此功能模拟注入不同百分比掩码的路由 ◆特点:只针对路由协议(目前RIP协议不支持,因为RIP ...

  9. 【C# .Net GC】条件自动垃圾回收 HandleCollector类

    条件自动回收 达到指定条件后自动执行GC回收垃圾. GC中的方法AddMemoryPressure和RemoveMemoryPressure 本机资源有时会消耗大量内存,但用于包装它的托管对象只占用很 ...

  10. navicat12.0.24安装注意事项

    关闭防火墙并断网,或者不要改变安装路径,或者换一个注册机 链接:https://pan.baidu.com/s/1AvEuD6TWGOCisSctF7pcbg  提取码:o4wp