week4CSP模拟测试——A:模拟题

主要思路:
一道模拟题
本题的关键是找出两个字符之间的“距离”,这里的距离是指转动圆盘可到达两个字符之间的最小距离。(即’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;
} 
发布了11 篇原创文章 · 获赞 0 · 访问量 127

猜你喜欢

转载自blog.csdn.net/weixin_43669888/article/details/104938777