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