项链游戏

[无link]

现给出一个字符串,它为一个环,可以从任意位置分开后顺时针构成一个整数,求构造的最大整数是多少?

对于该问题,我们在遍历更新的时候,如果比较了大于1次才得出大小关系,我们应该从最后一次比较的位置继续,反之,应该从第一次比较的下一个位置继续比较。

对于该策略证明:
1 如果只比较一次,显然
2 如果比较了k次,证明两个串前k个元素是相同的,第k+1个元素不同,那么我选择1-k-1中任何一个位置开始比较,答案都不会更优,因为如果新串第K+1个元素更大,那么显然K+1个元素会大于1-k的元素,那么显然以k+1开头更有可能更优,如果第K+1个元素更小,那么显然从中间截出来的串甚至比新串还小。


#include<string.h>
#include<stdio.h>
char s[2000006];
int ans;
int main(){
    gets(s);
    int l=strlen(s);
    strcat(s,s);
    for(int i=1;i<l;++i){
        for(int j=0;j<l;++j){
            if(s[i+j]>s[ans+j]){
                ans=i;
                if(j==0) break;
                else {
                    i=i+j-1;
                    break;
                } 
            }
            if(s[i+j]<s[ans+j]){
                if(j==0) break;
                else {
                    i=i+j-1;
                    break;
                }
            }
            if(j==l-1) goto A;
        }
    }
    A:
    for(int i=0;i<l;++i)
        putchar(s[ans+i]);
    return 0;
}

posted @ 2023-11-08 23:37  Simex  阅读(1)  评论(0编辑  收藏  举报