题目点这里(杭电2577)
题意:给你一段字符算出最小按键次数,并且最后capslk要换成小写状态
题解:仔细想想题目情况分为以大致的两种
1.当开关为 大写时
(1)当要打的字符为大写时,因为已经设置了大写,所以不需要考虑。
(2)当要打的字符为小写时,又分两种情况
2.1:当前要打的字母为小写,且下一位字母为大写时,只需要按shift键加上字母键即可
2.2:当前要打的字母为小写,且下一位字母为小写时,此时需要按capslk切换成小写状态即可,虽然两次的shift加上字母和capslk键开关次数相同,但是当循环到下一个字母时,如果为小写还是需要按shift加字母,而capslk键只需要在最后一个不是当前capslk状态时改变,所以当遇到两个字母大小型相同时还是变换capslk会更快。
2.当开关为小写时,与上述情况相同,略。
看代码:
3.注意在代码的最后要特判一下,因为题目要求capslk键为小写。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<stdlib.h>
using namespace std;
int t;
string s;
int dx(char c)
{
if(c>='a'&&c<='z')return 0; //小为0;
else return 1;
}
int main()
{
cin>>t;
while(t--)
{
cin>>s;
int ff=0,n=s.size();
int num=0;
for(int i=0; i<=n-2; i++)
{
if(ff==0)
{
if(dx(s[i])==1)
{
if(dx(s[i+1])==0)num++;
else ff=1,num++;
}
}
if(ff==1)
{
if(dx(s[i])==0)
{
if(dx(s[i+1])==1)num++;
else ff=0,num++;
}
}
}
if(ff==0&&dx(s[n-1])==1)num++;
if(ff==1)ff=0,num++;
num+=s.size();
cout<<num<<endl;
}
return 0;
}
代码应该还是比较简洁的。。。。。。