Codeforces Round #598 (Div. 3) B Minimize the Permutation
You are given a permutation of length nn. Recall that the permutation is an array consisting of nn distinct integers from 11 to nn in arbitrary order. For example, [2,3,1,5,4][2,3,1,5,4] is a permutation, but [1,2,2][1,2,2] is not a permutation (22 appears twice in the array) and [1,3,4][1,3,4] is also not a permutation (n=3n=3 but there is 44 in the array).
You can perform at most n−1n−1 operations with the given permutation (it is possible that you don't perform any operations at all). The ii-th operation allows you to swap elements of the given permutation on positions ii and i+1i+1. Each operation can be performed at most once. The operations can be performed in arbitrary order.
Your task is to find the lexicographically minimum possible permutation obtained by performing some of the given operations in some order.
You can see the definition of the lexicographical order in the notes section.
You have to answer qq independent test cases.
For example, let's consider the permutation [5,4,1,3,2][5,4,1,3,2]. The minimum possible permutation we can obtain is [1,5,2,4,3][1,5,2,4,3] and we can do it in the following way:
- perform the second operation (swap the second and the third elements) and obtain the permutation [5,1,4,3,2][5,1,4,3,2];
- perform the fourth operation (swap the fourth and the fifth elements) and obtain the permutation [5,1,4,2,3][5,1,4,2,3];
- perform the third operation (swap the third and the fourth elements) and obtain the permutation [5,1,2,4,3][5,1,2,4,3].
- perform the first operation (swap the first and the second elements) and obtain the permutation [1,5,2,4,3][1,5,2,4,3];
Another example is [1,2,4,3][1,2,4,3]. The minimum possible permutation we can obtain is [1,2,3,4][1,2,3,4] by performing the third operation (swap the third and the fourth elements).
The first line of the input contains one integer qq (1≤q≤1001≤q≤100) — the number of test cases. Then qq test cases follow.
The first line of the test case contains one integer nn (1≤n≤1001≤n≤100) — the number of elements in the permutation.
The second line of the test case contains nn distinct integers from 11 to nn — the given permutation.
For each test case, print the answer on it — the lexicograhically minimum possible permutation obtained by performing some of the given operations in some order.
4
5
5 4 1 3 2
4
1 2 4 3
1
1
4
4 3 2 1
1 5 2 4 3
1 2 3 4
1
1 4 3 2
Recall that the permutation pp of length nn is lexicographically less than the permutation qq of length nn if there is such index i≤ni≤n that for all jj from 11 to i−1i−1 the condition pj=qjpj=qj is satisfied, and pi<qipi<qi. For example:
- p=[1,3,5,2,4]p=[1,3,5,2,4] is less than q=[1,3,5,4,2]q=[1,3,5,4,2] (such i=4i=4 exists, that pi<qipi<qi and for each j<ij<i holds pj=qjpj=qj),
- p=[1,2]p=[1,2] is less than q=[2,1]q=[2,1] (such i=1i=1 exists, that pi<qipi<qi and for each j<ij<i holds pj=qjpj=qj).
选择最小的往前走。
#include<bits/stdc++.h>
using namespace std;
vector<int>p;
int pos[];
int vis[];
void solve() {
p.clear();
int n;
scanf("%d",&n);
memset(vis,,sizeof(vis));
memset(pos,,sizeof(pos));
for(int i=; i<n; i++) {
int x;
scanf("%d",&x);
p.push_back(x);//存数字
pos[x]=i;//记录每个数字的下标
}
for(int i=; i<=n; i++) {//移动最小的数字
int flag = ;
while(flag==) {
if(pos[i]>&&vis[pos[i]-]==) {//如果pos[1]=0,说明已经在一号位,就不用移动,
//如果没在一号位,他的前一位没有和他进行过交换
vis[pos[i]-]=;//那么就标记,交换过
int now=pos[i],pnow=pos[i]-;
swap(p[now],p[pnow]);//交换数字
swap(pos[p[now]],pos[p[pnow]]);//交换下标
} else {
flag=;
}
}
vis[pos[i]]=;//当目前最小的数字已经不能再交换了,那么他的位置也就不能再动,就标记
}
for(int i=; i<p.size(); i++) { //最后输出
cout<<p[i]<<" ";
}
cout<<endl; }
int main() {
int t;
scanf("%d",&t);
while(t--)solve();
}
//从后往前扫,遇到能往左边挪的就往左边挪。
//当然还有位置没有挪过,那就把没有被挪过的地方记录下来,然后再贪心把小的往左边挪。
#include<bits/stdc++.h>
using namespace std;
const int maxn = + ;
int a[maxn];
int vis[maxn];
int n;
int main() {
int T;
cin >> T;
while(T--) {
cin >> n;
for(int i = ; i <= n; i++) {
cin >> a[i];
vis[i] = ;
}
for(int i = n - ; i >= ; i--) {
if(a[i] > a[i+]) {
swap(a[i], a[i+]);
vis[i] = ;
}
}
for(int i = ; i <= n - ; i++) {
if(vis[i] == ) {
if(a[i] > a[i+])
swap(a[i], a[i+]);
}
}
for(int i = ; i <= n; i++)
printf("%d ", a[i]);
puts("");
}
return ;
}
Codeforces Round #598 (Div. 3) B Minimize the Permutation的更多相关文章
- Codeforces Round #598 (Div. 3) B. Minimize the Permutation 贪心
B. Minimize the Permutation You are given a permutation of length n. Recall that the permutation is ...
- Codeforces Round #598 (Div. 3)- E. Yet Another Division Into Teams - 动态规划
Codeforces Round #598 (Div. 3)- E. Yet Another Division Into Teams - 动态规划 [Problem Description] 给你\( ...
- 【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】
https://codeforces.com/contest/1256 A:Payment Without Change[思维] 题意:给你a个价值n的物品和b个价值1的物品,问是否存在取物方案使得价 ...
- Codeforces Round #598 (Div. 3)
传送门 A. Payment Without Change 签到. Code /* * Author: heyuhhh * Created Time: 2019/11/4 21:19:19 */ #i ...
- Codeforces Round #598 (Div. 3) A,B,C,D{E,F待补}
A. Payment Without Change #include<bits/stdc++.h> using namespace std; #define int long long ...
- Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp
E. Yet Another Division Into Teams There are n students at your university. The programming skill of ...
- Codeforces Round #598 (Div. 3)E(dp路径转移)
题:https://codeforces.com/contest/1256/problem/E 题意:给一些值,代表队员的能力值,每组要分3个或3个以上的人,然后有个评价值x=(队里最大值-最小值), ...
- Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 构造
F. Equalizing Two Strings You are given two strings s and t both of length n and both consisting of ...
- Codeforces Round #598 (Div. 3) D. Binary String Minimizing 贪心
D. Binary String Minimizing You are given a binary string of length n (i. e. a string consisting of ...
随机推荐
- 浏览器console控制台不显示编译错误/警告
浏览器正常显示报错应该是这样的 ,但是我一不小心右键给Hide message from...了,红色报错字体就没了,解决方法如下: 直接将红色框内的内容叉掉,恢复成filter就OK了
- CF573E Bear and Bowling(6-1)
题意 洛谷 做法一 考虑一种贪心(先别管对不对),设当前已选择的集合为\(A\),这是考虑该集合的补集,每个元素加进来后的增量为\(V_i\),则挑选最大的那个加入该集合 结论1:遵循上述贪心,\(\ ...
- How Many Answers Are Wrong HDU - 3038 带边权并查集
#include<iostream> #include<cstring> using namespace std; ; int d[N],p[N]; int find(int ...
- webpack打包后不能调用,改用uglifyjs打包压缩
背景: 项目基于原生js,没用到任何脚手架和框架,但也需要打包压缩. 项目的js中声明了一些全局变量 供其他js调用. 这时候如果用webpack打包,基于webpack特性,会嵌套一层大函数,会将j ...
- day:3.9基础复习
1.不要在模块之间相互调用,否则会出现麻绳现象,避免循环导入. ==:用来判断值是否相等(分别指向两个空间,但是空间里面的内容相同) is:判断指向是否相等. 例: a=[,,] b=[,,] a== ...
- Luogu4316 | 绿豆蛙的归宿 (期望DP)
题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都 ...
- [TJOI2009] 猜数字 - 中国剩余定理
现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意的i,n ...
- Echart的使用legend遇到的问题小记
Echart的图标真的很漂亮,使用也相对简单.但是官网的配置项的例子我不是很能快速的使用,得思考一会.哈哈,可能我比较笨吧. 在作柱状图的时候,我是通过Ajax动态获取的数据,但是图例legend就是 ...
- 获取mybaties插入记录自动增长的主键值
首先在Mybatis Mapper文件中insert语句中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是保存主键值的属性. 例如: <in ...
- JVM学习-环境构建
想学习JVM,java虚拟机的底层原理.下面介绍下怎么将Java文件compiler成字节码,然后反编译为二进制查看分析. 一.JavaClass.java文件: package com.gqz.ja ...