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


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