主要思路:
一道模拟题
本题的关键是找出两个字符之间的“距离”,这里的距离是指转动圆盘可到达两个字符之间的最小距离。(即’a’和’z’的距离是1,'a’和’b’的距离也是1)乍一看似乎找不到其中的规律,但是如果我们分成两步进行:
- 先计算两者之间的距离(不要求最小),显然是| b - a |
- 由于两个字符之间有两个距离(沿顺、逆时针走),取其最小即可
奇怪的坑
一份AC的代码中使用了string的结构,而我最开始使用的char数组,思路完全一样,但出现了TLE的问题,目前还不知道超时的原因(代码如下):
A TLE Solution
#include<stdio.h>
int main(){
char s[1010];
int tmp,ans=0;
scanf("%s",s);
for(int i=0;s[i]!='\0';i++){
if(!i)
tmp='a'-s[i]>0?'a'-s[i]:s[i]-'a';
else
tmp=s[i]-s[i-1]>0?s[i]-s[i-1]:s[i-1]-s[i];
if(tmp>13)
tmp=26-tmp;
ans+=tmp;
}
printf("%d\n",ans);
return 0;
}
A - 咕咕东的奇遇
咕咕东是个贪玩的孩子
有一天,他从上古遗迹中得到了一个神奇的圆环。
这个圆环由字母表组成首尾相接的环
环上有一个指针,最初指向字母a
咕咕东每次可以顺时针或者逆时针旋转一格
例如,a顺时针旋转到z,逆时针旋转到b
咕咕东手里有一个字符串,但是他太笨了
所以他来请求你的帮助,问最少需要转多少次。
Input
hzet
Output
31
A Possible Solution
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
cin>>s;
s='a'+s;
int tmp,ans=0;
for(int i=0;i<s.length()-1;i++){
tmp=s[i+1]-s[i];
if(tmp<0)tmp=-tmp;
if(tmp>13)tmp=26-tmp;
ans+=tmp;
}
cout<<ans<<endl;
return 0;
}