杭电2577

点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=2577

题目意思求出操作次数最小?最少只要多少次就可以输完一串字符!!

这里唯一要注意就是要考虑是否开(Capslock)是否关,,什么时候开启,怎样开启!到哪了关闭!最后是否关闭?

这里也就要分别用两个数组来保存开/关次数。并且最终判断出开关哪个用的次数最少!!

具体见代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
int a[1005];
int b[1005];
char str[105];
int main()
{
    int i,j,n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",&str);
        int len=strlen(str);
      //  memset(a,0,sizeof(a));
       // memset(b,0,sizeof(b));
        a[0]=0;b[0]=1;//当第一个字符大写是就Capslock,所以就为b[0]=1,否则就不打开Casplock,a[0]=0;
        for(i=0;str[i]!='\0';i++)
        {

            if(str[i]>='a'&&str[i]<='z')
            {
               a[i+1]=min(a[i],b[i]+2);//当第i个字符为小写时就直接接不要改变,或者开始加了(capslock)则就要b[i]+2;(开关)。
               b[i+1]=min(a[i]+1,b[i]+1);//如果要是开了,则每一次加+1;
            }
            else if(str[i]>='A'&&str[i]<='Z')
            {
                a[i+1]=min(a[i]+1,b[i]+1);//若当i个字符为大写时,若一开始为没开,则每一个就加1,
                b[i+1]=min(a[i]+2,b[i]);//若一开始开了,则只有变为小写,则每一个都加+2;
            }
           //  b[len-1]++;
        }
        int ans=min(b[len]+1,a[len]); //最后一个为关,则加1;
        printf("%d\n",ans+len);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值