记录编号 89561 评测结果 AAAAAAAAAA
题目名称 [Ural 1568] 火车车厢排序 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.079 s
提交时间 2014-03-02 21:11:15 内存使用 0.97 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
using namespace std;
const int SIZEN=10010;
int f[20][SIZEN]={0};
int N;
void turn(int a[],int b[]){
	pair<int,int> data[SIZEN];
	memset(data,0,sizeof(data));
	int rpos[SIZEN]={0};//在转换后的矩阵中第几行
	for(int i=1;i<=N;i++) data[i]=make_pair(a[i],i);
	sort(data+1,data+1+N);
	int numr=1;
	rpos[1]=1;
	for(int i=2;i<=N;i++){
		if(data[i].second>data[i-1].second) rpos[data[i].first]=numr;
		else rpos[data[i].first]=++numr;
	}
	int tot=0;
	for(int i=1;i<=N;i++) if(rpos[a[i]]&1) b[++tot]=a[i];
	for(int i=1;i<=N;i++) if(!(rpos[a[i]]&1)) b[++tot]=a[i];
}
bool check(int s[]){//是否升序
	for(int i=2;i<=N;i++) if(s[i-1]>s[i]) return false;
	return true;
}
int main(){
	freopen("traincarsorting.in","r",stdin);
	freopen("traincarsorting.out","w",stdout);
	scanf("%d",&N);
	int i;
	for(i=1;i<=N;i++) scanf("%d",&f[0][i]);
	for(i=0;!check(f[i]);i++) turn(f[i],f[i+1]);
	int step=i;
	printf("%d\n",step);
	for(int i=0;i<=step;i++){
		for(int j=1;j<=N;j++) printf("%d ",f[i][j]);
		printf("\n");
	}
	return 0;
}