题目描述
小敏和小燕是一对好朋友。
他们正在玩一种神奇的游戏,叫 M i n e c r a f t Minecraft Minecraft。
他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边。
他们想,在仅这一个操作下,最漂亮的工艺品能多漂亮。
两个工艺品美观的比较方法是,从头开始比较,如果第 i i i 个位置上方块不一样那么谁的瑕疵度小,那么谁就更漂亮,如果一样那么继续比较第 i + 1 i+1 i+1个方块。如果全都一样,那么这两个工艺品就一样漂亮。
输入格式
第一行一个整数 n,代表方块的数目。
第二行 n 个整数,每个整数按从左到右的顺序输出方块瑕疵度的值。
输出格式
一行 n 个整数,代表最美观工艺品从左到右瑕疵度的值。
输入输出样例
输入 #1
10
10 9 8 7 6 5 4 3 2 1
输出 #1
1 10 9 8 7 6 5 4 3 2
说明/提示
对于
20
20
20% 的数据,
n
≤
1000
n≤1000
n≤1000;
对于
40
40
40% 的数据,
n
≤
1
0
4
n≤10^4
n≤104;
对于 1
00
00
00% 的数据,
n
≤
3
×
1
0
5
n≤3×10^5
n≤3×105。
解题思路
最小表示法模板题:
最小表示法,顾名思义,就是一个数列,把它看成一个环,在不改变它顺序的情况下的字典序。不多解释了,看代码吧。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
using namespace std;
int n,k,i,j,a[40000000];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i];
}
i=1,j=2;
while(i<=n&&j<=n)
{
for(k=0;k<=n;k++)
if(a[i+k]!=a[j+k])
break;
if(k==n)break;
if(a[i+k]>a[j+k])
{
i=i+k+1;
if(i==j)i++;
}
else
{
j=j+k+1;
if(i==j)j++;
}
}
for(k=min(i,j);k<min(i,j)+n;k++)
printf("%d ",a[k]);
}