最强阵容
题目描述
拿着新换来的英雄卡,小李满心欢喜的准备和同学们PK一下。
他们的游戏规则非常简单,双方把自己的牌绕成一圈,然后指定一个起点,从该张牌开始顺时针方向往后取,谁取出的字符串字典序更小(从左到右开始比较,碰到第一个不一样的字符进行比较,比较规则为a<b<…<z)谁将获得胜利。具体规则可参考样例。虽然现在小李的牌已经很好了,但是你能不能帮他快速算出起始位置,使得他能够派出最强阵容。
输入
第一行n(1<=n<=30000),表示共有n张牌。
第二行共n个用一个空格隔开的小写字母,表示给定的一圈牌起始序列。
输出
仅一个整数,能获得最小字典序字符串的起点位置。如果有多个位置开始的字符串一样,则输出最小的那个位置,且第一个位置从1开始。
样例输入
复制样例数据
4 b c a b
样例输出
3
提示
四个位置取出的字符串分别为bcab,cabb,abbc,bbca,显然最小位置是3。
这个题吧,思路不难,就是挨个走一遍,然后比每一位,找最小的,我是通过一个设最小值,并找出所有等于最小值的下标并存入另一个数组,然后再遍历,复杂度可能会小一点(我自以为,大牛勿喷QAQ),
但这个题有个坑,我一开始用%c加getchar();输入,一直worry answer,后来我换了%s就过了.至今还蒙在鼓里...请大牛指点迷津.
#include<iostream>
#include<algorithm>
using namespace std;
int main(int argc, char const *argv[])
{
int n,m;
while(~scanf("%d",&n))
{
if(n==0)
continue;
int str[31000],minn=50;
for(int i=0;i<n;i++)
{ //之前用的如下,困扰我好几天
char x[2]; //char x;
scanf("%s",x); //scanf("%c",&x);
str[i]=x[0]-'a'+1; //getchar();
minn=min(minn,str[i]);
}
int minstr[31000],minnum=0;
for(int i=0;i<n;i++)
{
if(minn==str[i])
{
minstr[minnum++]=i;
}
}
int minner=minstr[0];
for(int i=1;i<minnum;i++)
{
int flag=0;
for(int j=minner,k=minstr[i],cmp=0;cmp<n;j++,k++,cmp++)
{
if(str[j%n]>str[k%n]) //minner即为所求
{
flag=1;
break;
}
else if(str[j%n]<str[k%n])
break;
}
if(flag==1)
minner=minstr[i];
}
printf("%d\n",minner%n+1);
}
return 0;
}