模拟2

1. CSPM1-1

1.1 题目大意

将26个字母成圆盘状排列,给出一个字符串,要求将圆盘从a开始选转,按照字符串中的字母顺序,依次旋转得到每一个字母,若一次只能旋转一个单位距离,问至少需要多少次旋转,才能得到字符串中所有字母?
题图

input

zeus

output

18

1.2 思路

这道题容易想的太麻烦,其实,圆环中任意两个字母之间的距离只有两种情况: ∣ x − y ∣ |x-y| xy 26 − ∣ x − y ∣ 26-|x-y| 26xy

也就是说,环中任意两点之间的距离,不会超过26的一半。又因为环中的字母,是按照顺时针,由小到大排列的,所以, ∣ x − y ∣ |x-y| xy实质上表示顺时针方向距离(假设x<y), 26 − ∣ x − y ∣ 26-|x-y| 26xy为逆时针方向距离,这两个哪个小,要哪个。

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| xy 26 − ∣ x − y ∣ 26-|x-y| 26xy

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值