1. CSPM1-1
1.1 题目大意
将26个字母成圆盘状排列,给出一个字符串,要求将圆盘从a开始选转,按照字符串中的字母顺序,依次旋转得到每一个字母,若一次只能旋转一个单位距离,问至少需要多少次旋转,才能得到字符串中所有字母?
input
zeus
output
18
1.2 思路
这道题容易想的太麻烦,其实,圆环中任意两个字母之间的距离只有两种情况: ∣ x − y ∣ |x-y| ∣x−y∣和 26 − ∣ x − y ∣ 26-|x-y| 26−∣x−y∣
也就是说,环中任意两点之间的距离,不会超过26的一半。又因为环中的字母,是按照顺时针,由小到大排列的,所以, ∣ x − y ∣ |x-y| ∣x−y∣实质上表示顺时针方向距离(假设x<y), 26 − ∣ x − y ∣ 26-|x-y| 26−∣x−y∣为逆时针方向距离,这两个哪个小,要哪个。
1.3 代码
#include<bits/stdc++.h>
using namespace std;
int sp2(char x, char y)
{
int dis=abs(x-y);
if(dis>13) return 26-dis;
else return dis;
}
int main()
{
char str[10000];
scanf("%s",str);
int n=strlen(str);
int cnt=0;
char c = 'a';
for(int i=0;i<n;i++)
{
cnt+=sp2(str[i],c);
c=str[i];
}
cout<<cnt<<endl;
return 0;
}
1.4 注
第一遍做的时候,想得有些复杂,当时按照x,y中比较小的那个数是否大于13分类,分别讨论两种情况,及其距离计算,其实归根到底,还是讨论两种情况: ∣ x − y ∣ |x-y| ∣x−y∣和 26 − ∣ x − y ∣ 26-|x-y| 26−∣x−y∣。
int sp(int x,int c)
{
// cout<<x<<" "<<c<<endl;
int a = min(x,c);
int b= max(x,c);
int ans=0;
if(a<13)
{
if((a+13)%26>=b)
{
ans = b-a;
}
else if((a+13)%26<b)
{
ans = 26+a-b;
}
}
else if(a>=13)
{
if((a+13)%26>=b)
{
ans = 26+a-b;
}
else if((a+13)%26<b)
{
ans = b-a;
}
}
// cout<<ans<<endl;
return ans;
}