#include<iostream> #include<algorithm> #include<vector> #include<utility> #include<string> using namespace std; int logo[26]={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};//标记每个小写字母在哪个键上 int tim[26]= {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 main(){ //freopen("G:\\in.txt","r",stdin); //freopen("G:\\out.txt","w",stdout); string s; while(cin>>s){ int sum[s.size()]; for(int i=0;i<s.size();i++){ sum[i]=0; if(i)sum[i]+=sum[i-1]; if(i-1>=0){ if(logo[s[i-1]-'a']==logo[s[i]-'a']) { sum[i]+=2; //前一个是同类 } else if(tim[s[i-1]-'a']==1){ //前一个不是同类 且前一个按键之用1个时间 //则需要看前两个 当有前两个的时候 且倒数第二个 比倒数第一个之间 没有间隔 防止ajaj 的情况 if(i-2>=0&&logo[s[i-2]-'a']==logo[s[i]-'a']&&sum[i-2]-sum[i-1]==0) sum[i]+=1; } } sum[i]+=tim[s[i]-'a']; } cout<<sum[s.size()-1]<<endl; } //fclose(stdin); //fclose(stdout); }
这个题目还是要注意一下,一开始没注意到 ajaj 这种情况
除此之外 看一下前一个 、前两个的状态,记录一下时间即可