$$\huge\color{blue}{手机键盘——打表模拟}$$
题目大意
给定一个九键键盘,请按照题目的要求判断输入一个字符需要花费多少单位时间。
规则:
按一个块,花费一单位时间,会顺序变成这个块内的字符。
第一次按的是
a
,第二次按的才是b
。若两个相邻字符在同一块,需要等待两单位时间,才可以继续按。
思路
直接打表模拟,这种题目不适合用if
和else
判断语句。
时空复杂度
单次操作
均与字符串长度相关。
多次操作
均与字符串长度和数据组数相关。
正确代码
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;//较高精度的浮点数
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
const int CHAR=30;
int click[CHAR]={
1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4
};
int pos[CHAR]={
1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7,8,8,8,8
};
//click[i]表示在i的块内点击到i需要几次
//pos[i]表示i在哪一块区域
int main ()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
string s;
while(cin>>s)
{
int res=0;
for (int i=0;i<s.size();++i)
{
res+=click[s[i]-'a'];//当前字符需要点多少次
if (i==0)
continue;//防护越界
if (pos[s[i]-'a']==pos[s[i-1]-'a'])
res+=2;//如果当前字符和当前字符的前一个字符同块,特判
}
cout<<res<<"\n";
}
return 0;
}
我很好奇,你上面那一串有啥用??