0%

咕咕东的奇遇

咕咕东的奇遇

问题描述

咕咕东是个贪玩的孩⼦,有⼀天,他从上古遗迹中得到了⼀个神奇的圆环。这个圆环由字⺟表组成首尾相接的环,环上有⼀个指针,最初指向字⺟a。咕咕东每次可以顺时针或者逆时针旋转⼀格。例如,a顺时针旋转到z,逆时针旋转到b。咕咕东⼿⾥有⼀个字符串,但是他太笨了,所以他来请求你的帮助,问最少需要转多少次。

0001.png

Input

输⼊只有⼀行,是⼀个字符串。

Output

输出最少要转的次数。

Sample

Input: 
zeus
Output:
18

Limitation

Time limit		1000 ms
Memory limit 65536 kB

数据范围

数据点 字符串长度
1, 2 ≤ 10
3, 4, 5 ≤ 100
6, 7, 8, 9, 10 ≤ 10000

解题思路

简单题,起点为a,每次只有顺时针或者逆时针2种选择,而顺/逆时针判断条件是走的步数是否≤13,由于转盘是有序的,而走的步数可以通过字母表确定。利用a - zASCII码有序对应97 - 122,两者ASCII的差值+26再除26求余数即可确定步数,然后把起点标记为走到的那一个,如此循环,直至走完。

但是由于个人疏忽,if判断处有写(差值+26)%26,确定步数时却忘了+26直接进行求余,看着样例没问题,自己出样例又要费时间去算,就直接提交,然后WA了……分全没了……😭(赛后补题补上+26直接AC了……)

源代码

#include <iostream>
using namespace std;

int main() {
//顺逆13n
char start = 'a';//起始点为a

string x;
cin >> x;
int n = x.length();
int count = 0;//总步数
int step = 0;//单次步数
for (int i = 0; i < n; i++) {
if (((x[i] - start + 26) % 26) <= 13) {//逆时针
step = (x[i] - start + 26) % 26;
count += step;
start = x[i];
}

if (((x[i] - start + 26) % 26) > 13) {//顺时针
step = 26 - (x[i] - start + 26) % 26;
count += step;
start = x[i];
}
}

cout << count << endl;

return 0;
}