奶牛合影(最小表示法)
Time Limit: 1000 MS Memory Limit: 131072 K
Description
約翰有N頭奶牛,有一天,他想讓所有奶牛排成一排照一張全家福。
但是奶牛畢竟是奶牛,顏值的瑕疵無可避免,每頭奶牛都有一個瑕疵度。
由於約翰千載難逢纔會讓奶牛們拍一次合照,他希望整個隊列儘可能美觀。 對於兩個奶牛隊列美觀度的比較方法是:
從頭(從左側)開始比較,如果第i位置上奶牛的瑕疵度不一樣那麼誰的瑕疵度小,那麼哪個隊列就更漂亮,如果一樣就繼續比較第i+1頭奶牛。如果全部一樣,那麼兩個隊列就一樣漂亮。
剛開始,奶牛們會隨機站成一排,約翰每次只能要求站在最左側的奶牛排到最右側。他想知道,在這種情況下,可以達到的最漂亮奶牛的排列的排列方法。
Input
第一行爲組數T
對於每組數據:
第一行一個整數n(n<=300000),代表奶牛的數目
第二行n個整數ai(ai<10^9),每個整數代表從左到右的每頭奶牛的瑕疵度。
Output
共T行
每行輸出n個整數,表示該組數據達到最優美時,從左到右每頭奶牛的瑕疵度
Sample Input
1
10
10 9 8 7 6 5 4 3 2 1
Sample Output
1 10 9 8 7 6 5 4 3 2
題意:
一串數字,可以左右平移,經過平移之後,要求輸出它最小字典序的排列。
感想:
最小表示法的理解上次已經寫過一遍了,詳見kmp分類。。
getmin()返回的是最小串的 第一個數字在原串中的位置 所以直接輸出就好啦
既然是寫給自己的 就懶的再複製一遍了orz
博客自己回顧的時候要方便一點
所以以後寫的解題吐槽就全都備份到這裏好了(:з」∠)
// Created by ZYD in 2015.
// Copyright (c) 2015 ZYD. All rights reserved.
//
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int Maxn=3e5+5;
#define ll long long
#define mk make_pair
#define pb push_back
#define mem(array) memset(array,0,sizeof(array))
typedef pair<int,int> P;
int T,n;
int a[Maxn];
int getmin()
{
int i,j,k,tmp;
i=0;j=1;k=0;
while(i<n && j<n && k<n)
{
tmp=a[(i+k)%n]-a[(j+k)%n];
if(tmp==0)
{
k++;
}
else
{
if(tmp>0)
{
i=i+k+1;
}
else j=j+k+1;
if(i==j)
j++;
k=0;
}
}
return min(i,j);
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int t=getmin();
int p=0;
printf("%d",a[t]);
p++;t++;if(t>=n) t=t%n;
while(p<n){
printf(" %d",a[t]);
t++;
p++;
if(t>=n) t=t%n;
}
printf("\n");
}
return 0;
}