咕咕东的奇遇

问题描述

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

Input

输入只有一行,是一个字符串。

Output

输出最少要转的次数。

Sample input

zeus

Sample output

18

解题思路

这个题是一个模拟题,就是按照题目要求,计算字符串两个相邻字符之间的最短距离即可。我们可以直接对两个字符做差计算它们之间的距离,要考虑的是取顺时针还是逆时针。
如果是顺时针转动,距离为s[i]-s[i-1];如果逆时针转动,距离为’z’-s[i]+s[i-1]-‘a’+1。两者的结果如果是负数,就加26(因为这是一个环)。

完整代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
using namespace std;

string s;
long long ans;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>s;
    int len1=s[0]-'a';
    int len2='z'-s[0]+1;
    ans+=min(len1>=0?len1:100,len2>=0?len2:100);
    for (int i=1; i<s.length(); i++)
    {
        len1=s[i]-s[i-1];
        len1=min(abs(len1),len1+26);//这么写纯粹是懒得判断len1是否为正数了

        len2='z'-s[i]+s[i-1]-'a'+1;
        len2=min(abs(len2),len2+26);

        ans+=min(len1,len2);
    }
    cout<<ans<<endl;
    return 0;
}
发布了32 篇原创文章 · 获赞 24 · 访问量 2237

猜你喜欢

转载自blog.csdn.net/weixin_43347376/article/details/104867940
今日推荐