CQU 奶牛合影(裸最小表示法)

奶牛合影(最小表示法)

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章