https://vjudge.net/problem/UVA-11925
题目
给出一个$1,2,3,cdots,n$的排列,要求输出一串操作,使${1,2,3,cdots,n}$变为给定的排列。
1:交换前两个元素的位置,2:把第一个元素放至末尾。
题解
联想冒泡排序……
需要把给的排列转化为顺序排列,顺序排列转化为另外一个乱序排列
(但是如果元素可以重复又该怎么办呢……)
AC代码
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") #include<bits/stdc++.h> using namespace std; #define REP(r,x,y) for(register int r=(x); r<(y); r++) #define REPE(r,x,y) for(register int r=(x); r<=(y); r++) #ifdef sahdsg #define DBG(...) printf(__VA_ARGS__) #else #define DBG(...) #endif template<class T> inline void read(T &x) { char ch = getchar(); x=0; int f=1; while(!isdigit(ch) && ch!='-') ch=getchar(); if(ch=='-') f=-1,ch=getchar(); while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar(); } x*=f; } #define MAXN 10007 int arr[MAXN]; int v; int main() { #ifdef sahdsg freopen("in.txt", "r", stdin); #endif int t; while(~scanf("%d", &t) && t) { REP(i,0,t) { scanf("%d", &v); arr[v-1]=i; } int cnt=0; bool sorted=true; REP(i,0,t-1) { sorted=true; REP(j,0,t-i-1) { if(arr[j]>arr[j+1]) sorted = false; } if(sorted) break; REP(j,0,t-i-1) { if(arr[j]>arr[j+1]) { putchar('1'); swap(arr[j],arr[j+1]); } putchar('2');cnt++; } REP(j,t-i-1,t) { putchar('2');cnt++; } } putchar(' '); } return 0; }