UVA 11925 Generating Permutations

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('\n');
	}
	
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/sahdsg/p/10503709.html