题目描述:
咕咕东是个贪玩的孩子,有一天,他从上古遗迹中得到了一个神奇的圆环。这个圆环由字母表组成首尾相接的环,环上有一个指针,最初指向字母a。咕咕东每次可以顺时针或者逆时针旋转一格。例如,a顺时针旋转到z,逆时针旋转到b。咕咕东手里有一个字符串,但是他太笨了,所以他来请求你的帮助,问最少需要转多少次。
Input:
输入只有一行,是一个字符串。
Output:
输出最少要转的次数。
Sample Input-1:
zeus
Sample Output-1:
18
Sample Input-2:
hzet
Sample Output-2:
31
Hint:
数据点 | 字符串 |
---|---|
1,2 | 小于等于10 |
3,4,5 | 小于等于100 |
6,7,8,9,10 | 小于等于100000 |
思路:
本题主体是字符串的应用,用到的思想是贪心,对于字符串中的每个字符,首先要考虑转到它下一个字符是顺时针还是逆时针,即判断两种转法所转过的路径长度和13进行比较,如果小于等于13,就加上本次次数,否则就加上26-本次次数,然后把上一个字符串作为起点进行下一次查找。
总结:
在进行查找的次数过程中,需要考虑差是负数,所以需要对于每个次数取绝对值。
代码:
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int main(){
int op,ans=0,sum=0;
string str;
cin>>str;
for(int i=0;i<str.length();i++){
if(str[i]>='a'&&str[i]<='z')
op=(str[i]-'a')-ans;
else if(str[i]>='A'&&str[i]<='Z')
op=(str[i]-'A')-ans;
if(abs(op)<=13)
sum+=abs(op);
else
sum+=(26-abs(op));
if(str[i]>='a'&&str[i]<='z')
ans=str[i]-'a';
else if(str[i]>='A'&&str[i]<='Z')
ans=str[i]-'A';
}
cout<<sum<<endl;
}