杭电2577(模拟)

题目点这里(杭电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;
}

代码应该还是比较简洁的。。。。。。

Guess you like

Origin blog.csdn.net/weixin_51626694/article/details/116452232