Code Forces 496 B. Secret Combination(水~)

Description
给出一个长度为n的数字串,有两种操作,第一种是将每个数字加一(9+1=0),第二种是将整个串右移一位(最后一个元素挪到第一个元素的位置),现可对这个串进行任意次上述操作,输出能够得到的字典序最小的串
Input
第一行为一整数n表示串的长度,第二行为一长度为n的数字串 (1 ≤ n ≤ 1000)
Output
输出进过一系列操作之后能够得到的字典序最小的串
Sample Input
3
579
Sample Output
024
Solution
简单题,两种操作互不影响,暴力枚举所有状态即可,首先枚举对每一位加i(0<=i<=9),然后枚举右移j位(0<=j<=n-1),不断更新最优解即可,时间复杂度O(10*n^n)=O(10^7)
Code

#include<stdio.h>
#include<string.h>
#define maxn 1111
int n;
char s[maxn],c[maxn],ans[maxn];
void init(char *s)
{
    for(int i=0;i<n;i++)
        s[i]='9';
}
void deal(char *s,char *c,int x)
{
    for(int i=0;i<n;i++)
    {
        int temp=s[i]-'0';
        temp=(temp+x)%10;
        c[i]=temp+'0';
    }
    c[n]='\0';
}
void cmp(char *s,char *c)
{
    if(strcmp(c,s)<0)
        for(int i=0;i<n;i++)
            s[i]=c[i];
}
void right(char *c)
{
    for(int i=n;i>0;i--)
        c[i]=c[i-1];
    c[0]=c[n];c[n]='\0';
}
int main()
{
    while(~scanf("%d",&n))
    {
        scanf("%s",s);
        init(ans);
        for(int i=0;i<10;i++)
        {
            deal(s,c,i);
            for(int j=0;j<n;j++)
            {
                cmp(ans,c);
                right(c);
            }
        }
        puts(ans);
    }
    return 0;
}

你可能感兴趣的:(Code Forces 496 B. Secret Combination(水~))