【bzoj2882】工艺 最小表示法
【bzoj2882】工艺
Description
小敏和小燕是一对好朋友。
他们正在玩一种神奇的游戏,叫Minecraft。
他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边。
他们想,在仅这一个操作下,最漂亮的工艺品能多漂亮。
两个工艺品美观的比较方法是,从头开始比较,如果第i个位置上方块不一样那么谁的瑕疵度小,那么谁就更漂亮,如果一样那么继续比较第i+1个方块。如果全都一样,那么这两个工艺品就一样漂亮。
Input
第一行两个整数n,代表方块的数目。
第二行n个整数,每个整数按从左到右的顺序输出方块瑕疵度的值。
Output
一行n个整数,代表最美观工艺品从左到右瑕疵度的值。
Sample Input
10
10 9 8 7 6 5 4 3 2 1
Sample Output
1 10 9 8 7 6 5 4 3 2
HINT
【数据规模与约定】
对于20%的数据,n<=1000
对于40%的数据,n<=10000
对于100%的数据,n<=300000
题解
输出最小表示TAT
1 #include<cstring> 2 #include<cmath> 3 #include<algorithm> 4 #include<iostream> 5 #include<cstdio> 6 7 #define N 300007 8 using namespace std; 9 inline int read() 10 { 11 int x=0,f=1;char ch=getchar(); 12 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 13 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 17 int n; 18 int a[N]; 19 20 int min_express() 21 { 22 int i=0,j=1,k=0; 23 while(i<n&&j<n&&k<n) 24 { 25 int t=a[(i+k)%n]-a[(j+k)%n]; 26 if (!t)k++; 27 else 28 { 29 if (t>0)i+=k+1; 30 else j+=k+1; 31 if (i==j) j++; 32 k=0; 33 } 34 } 35 return min(i,j); 36 } 37 int main() 38 { 39 n=read(); 40 for (int i=0;i<n;i++) 41 a[i]=read(); 42 int pst=min_express(); 43 for (int i=0;i<n;i++){printf("%d",a[(pst+i)%n]);if (i!=n-1)cout<<" ";} 44 }