Week4--CSP模擬--A - 咕咕東的奇遇

題目描述

一個圓環包含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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章