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 ...
随机推荐
- Python_基础数据类型
一,首先介绍一下变量 1. 变量是什么 在Python中,变量的概念基本上和初中代数的方程变量是一致的. 2. 变量命名规则 由数字.字母.下划线组成 不能以数字开头 要具有描述性 要区分大小写 禁止 ...
- mui下拉刷新上拉加载
新外卖商家端主页订单大厅页面 使用mui双webview,实现下拉刷新上拉加载 主页面: order_index.html <!doctype html> <html> < ...
- Pycharm有必要改的几个默认设置项
最近在用Pycharm学习Python的时候,总有两个地方感觉不是很舒服,比如调用方法的时候区分大小写(thread就不会出现Thread,string就不会出现String)等,这让我稍稍有点不舒服 ...
- cookies欺骗-bugkuctf
解题思路: 打开链接是一串没有意义的字符串,查看源码没有发现什么,然后查看url,发现 filename的值是base64编码的,拿去解码 发现是一个文件,那么我们这里应该可以读取当前目录下的本地文件 ...
- 安全 - CORS(脚本请求等)
功能概述 出于安全原因,浏览器限制从脚本内发起的跨域HTTP请求 或 拦截了跨域请求的结果. 例如,XMLHttpRequest和Fetch API遵循同源策略. 这意味着使用这些API的Web应用程 ...
- sql server针对字符串型数字排序(针对此字符串的长度不一致)
对于不规则的字符串数字排序,无法按照数字大的大小排序的原因是,字符串数字在数据库中按照ASCII码排序,从字符的第一个数字对比,首先就会将为首个数字相同的排在一起,在从这些字符串里面对比第二个数字,如 ...
- vue 查看dist文件里的结构
场景:优化打包后的代码,提高性能. 1.方式一:report-json. 1.1 package.json文件里加入以下命令, "report": "vue-cli-se ...
- mybatis - 基于拦截器修改执行中的SQL语句
拦截器介绍 mybatis提供了@Intercepts注解允许开发者对mybatis的执行器Executor进行拦截. Executor接口方法主要有update.query.commit.rollb ...
- Nginx 配置Websocket
Nginx反向代理配置websocket nginx.org 官网推荐如下的配置,也可以直接看官网:http://nginx.org/en/docs/http/websocket.html http ...
- GearHost稳定免费美国全能空间测试主机100M容量
GearHost是一家美国的全能空间服务商,提供有免费100M容量的空间,月流量1G,限制CPU使用5%,由于配置过小只适合于开发测试使用,不过主机支持的脚本众多,支持PHP.NET和node.js还 ...