• BZOJ2882: 工艺


    题解:

    裸的字符串最小表示。。。

    可以戳这里:http://www.cnblogs.com/ACAC/archive/2010/05/23/1742349.html

    这里说一下为什么a[i+k]>a[j+k]的时候可以让 i 跳到 i+k+1

    也就是说i-i+k这一段不会有一个后缀成为最小表示的前缀,那我们只要构造出一个比它小的就可以了。

    显然 如果我们取a[i+x]--a[i+k+1],我们总有a[j+x]--a[j+x+1]比它小,也就是在长度不及len的时候就不是最小了所以不可能是最小表示。

    所以我们枚举起点看看它能够延伸多长始终都是同长度中最小的,当该长度为len的时候说明它就是最小表示。

    还有最后为什么要返回min(i,j)

    因为。。。挖坑待填。。。

    代码:

     1 #include<cstdio>
     2 
     3 #include<cstdlib>
     4 
     5 #include<cmath>
     6 
     7 #include<cstring>
     8 
     9 #include<algorithm>
    10 
    11 #include<iostream>
    12 
    13 #include<vector>
    14 
    15 #include<map>
    16 
    17 #include<set>
    18 
    19 #include<queue>
    20 
    21 #include<string>
    22 
    23 #define inf 1000000000
    24 
    25 #define maxn 300000+5
    26 
    27 #define maxm 20000000+5
    28 
    29 #define eps 1e-10
    30 
    31 #define ll long long
    32 
    33 #define pa pair<int,int>
    34 
    35 #define for0(i,n) for(int i=0;i<=(n);i++)
    36 
    37 #define for1(i,n) for(int i=1;i<=(n);i++)
    38 
    39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
    40 
    41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
    42 #define for4(i,x) for(int i=head[x],y;i;i=e[i].next)
    43 
    44 #define mod 1000000007
    45 
    46 using namespace std;
    47 
    48 inline int read()
    49 
    50 {
    51 
    52     int x=0,f=1;char ch=getchar();
    53 
    54     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    55 
    56     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
    57 
    58     return x*f;
    59 
    60 }
    61 int n,a[maxn];
    62 
    63 int main()
    64 
    65 {
    66 
    67     freopen("input.txt","r",stdin);
    68 
    69     freopen("output.txt","w",stdout);
    70 
    71     n=read();
    72     for0(i,n-1)a[i]=read();
    73     int i=0,j=1,k=0;
    74     while(i<n&&j<n&&k<n)
    75     {
    76         int t=a[(i+k)%n]-a[(j+k)%n];
    77         if(!t)k++;
    78         else
    79         {
    80             k=0;
    81             if(t>0)i+=k+1;else j+=k+1;
    82             if(i==j)i++;
    83         }
    84     }
    85     int ans=min(i,j);
    86     printf("%d",a[ans%n]);
    87     for1(i,n-1)printf(" %d",a[(ans+i)%n]);     
    88 
    89     return 0;
    90 
    91 }  
    View Code

    2882: 工艺

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 48  Solved: 24
    [Submit][Status]

    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

  • 相关阅读:
    求s=1+1+2+1+2+3+1+2+3+4......+n 分类: python 20121205 15:04 387人阅读 评论(0) 收藏
    虚拟机下安装Linux,提示CPU不支持64位的解决方法 20121203 15:50 637人阅读 评论(0) 收藏
    python中map()函数的使用 分类: python 20121220 16:18 121人阅读 评论(0) 收藏
    round()、pow()、return 分类: python 20121212 19:46 133人阅读 评论(0) 收藏
    python之enumerate 分类: python 20121205 10:55 311人阅读 评论(0) 收藏
    str判断字符串方法 分类: python 20121212 20:40 110人阅读 评论(0) 收藏
    创建文件,输出文件内容及打开模式 分类: python 20121224 16:49 155人阅读 评论(0) 收藏
    3.31Java对象的进化史(数据管理和企业管理共通之处)
    4.1Java一个典型类的定义和UML图
    4.2Java对象创建过程和this的本质
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4174242.html
Copyright © 2020-2023  润新知