題目描述
一個圓環包含26個英文字母,順時針從a到z排列,有一個指針指向a,每次可以順時針或逆時針旋轉一格。如a順時針旋轉到z,逆時針旋轉到b。現在有一個字符串(長度<=10000),請輸出要得到這個字符串最少需要旋轉的次數。
輸入
輸入只有一行,是一個字符串。 |
輸出
輸出最少要轉的次數。 |
樣例輸入
zeus |
樣例輸出
18 |
思路
綜述
這是一道模擬題,沒有用到很難的算法。只要理清楚邏輯,就不難做對;
每到一個數思考:
1)順時針轉多少到下一個;
2)逆時針轉多少到下一個;
選擇小的一個;
循環上述;
優化:兩個方向加起來的數一共是26,所以只討論一個方向即可,如果這個方向轉動的次數小於等於13則選擇該方向,並且累計步數,反之則累計(26-該方向的步數)
過程
Step1:初始化
每次都從a開始
累加器tot(int)
char now='a';
int tot=0;
Step2:循環開始找字母
下一個字母的選擇一共有三種選擇方式
選擇的原則是,從字母Ascll碼小的一個移動到大的一個,計算步數是多少,根據和13的關係來判斷是選擇哪一個
分支1:下一個字母和目前的字母是相同的
if(now==s[i])continue;
分支2:下一個字母Ascll碼大於當前的字母;更新term;
else if(now<s[i]) term=s[i] - now;
分支3:下一個字母Ascll碼小於當前的字母;更新term
else if (s[i]<now) term=now-s[i];
判斷term和13的關係並且更新tot
if(term<=13) tot+=term;
else tot += (26-term);
更新字母
now = s[i];
總結
面向CSP第三題的大模擬,基本的思路是:先對場景進行建模,對於本題沒有用到算法,故只需要模擬出操作流程就可以,但是如本次模擬測試的C題,不僅僅要理清楚邏輯,對場景進行建模,而且要聯繫到學到的算法上,在真正的CSP 中,大都不會出現只會模擬場景即可的題。
所以如何由具體的場景聯繫到所學是很重要的,而且需要熟練掌握算法。
代碼
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
int i;
cin>>s;
char now='a';
int tot=0;
int term;
for(i=0;i<s.size();i++){
if(now==s[i])continue;
else if(now<s[i]) term=s[i] - now;
else if (s[i]<now) term=now-s[i];
if(term<=13) tot+=term;
else tot += (26-term);
now = s[i];
}
cout<<tot;
}