首页 > 其他 > 详细

最强阵容

时间:2018-04-25 23:51:28      阅读:236      评论:0      收藏:0      [点我收藏+]

5780: 最强阵容

时间限制: 1 Sec  内存限制: 128 MB
提交: 206  解决: 54
[提交][状态][讨论版][命题人:admin]

题目描述

拿着新换来的英雄卡,小李满心欢喜的准备和同学们PK一下。
他们的游戏规则非常简单,双方把自己的牌绕成一圈,然后指定一个起点,从该张牌开始顺时针方向往后取,谁取出的字符串字典序更小(从左到右开始比较,碰到第一个不一样的字符进行比较,比较规则为a<b<…<z)谁将获得胜利。具体规则可参考样例。虽然现在小李的牌已经很好了,但是你能不能帮他快速算出起始位置,使得他能够派出最强阵容。
 

输入

第一行n(1<=n<=30000),表示共有n张牌。
第二行共n个用一个空格隔开的小写字母,表示给定的一圈牌起始序列。
 

输出

仅一个整数,能获得最小字典序字符串的起点位置。如果有多个位置开始的字符串一样,则输出最小的那个位置,且第一个位置从1开始。

样例输入

4
b c a b

样例输出

3

提示

四个位置取出的字符串分别为bcab,cabb,abbc,bbca,显然最小位置是3。

 

******************************************************************************************************************************************************************************************************

代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main()
{
    int n;
    char str[30005];
    scanf("%d",&n);
    //getchar();
    char x[50];
    for(int i=0;i<n;i++)   //读取
    {
        scanf("%s",x);
        str[i] = x[0];
        //str[i] = getchar();
        //getchar();
    }
    str[n] = \0;

    int ans = 0;   //记录最小的答案
    for(int i=1;i<n;i++)
    {
        if(str[i]<str[ans])
            ans = i;
        else if(str[i]==str[ans]) //==
        {
            for(int j=ans+1,k = i+1,p=0;p<n;p++,j++,k++) //j是最小的下一位 k是当前遍历的下一位
            {
                if(str[j%n]<str[k%n]) //原本最小位的字符串小
                {
                    break;
                }
                else if(str[j%n]>str[k%n]) //当前位的字符串小
                {
                    ans = i;
                    break;
                }
            }
        }
    }
    printf("%d",ans+1);
}

//wa了很多次 开始用的n*n暴力解决 发现会超时 后来改成以上做法  但是用getchar()读入不知道为什么会错  改成scanf("%s")才A。

最强阵容

原文:https://www.cnblogs.com/hao-tian/p/8947285.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!