hdoj-2577-How to Type (最少按键次数)

How to Type

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 4657 Accepted Submission(s): 2109

Problem Description

Pirates have finished developing the typing software. He called Cathy to test his typing software. She is good at thinking. After testing for several days, she finds that if she types a string by some ways, she will type the key at
least. But she has a bad habit that if the caps lock is on, she must turn off it, after she finishes typing. Now she wants to know the smallest times of typing the key to finish typing a string.

Input

The first line is an integer t (t<=100), which is the number of test case in the input file. For each test case, there is only one string which consists of lowercase letter and upper case letter. The length of the string is at most
100.

Output

For each test case, you must output the smallest times of typing the key to finish typing this string.

Sample Input

3
Pirates
HDUacm
HDUACM

Sample Output

8
8
8

Hint

The string “Pirates”, can type this way, Shift, p, i, r, a, t, e, s, the answer is 8.
The string “HDUacm”, can type this way, Caps lock, h, d, u, Caps lock, a, c, m, the answer is 8
The string "HDUACM", can type this way Caps lock h, d, u, a, c, m, Caps lock, the answer is 8

Author

Dellenge

Source

HDU 2009-5 Programming Contest

#include<stdio.h>
#include<string.h>
char s[110];
int da_ju(int i){
    if((s[i]>='A')&&(s[i]<='Z')) return 1;
    return 0;
}
int caps=0;
int fun(int i){
    if(caps){
          if(da_ju(i)) return 1;
        else {
           if(s[i+1]=='\0') {  //s[i] 是最后一个大写字母;
            caps=0;
            return 1;
           }
           else if(da_ju(i+1)) return 2;  //s[i] 是小写字母,而后跟的是大写字母,此时执行: shift+s[i]本身;
           else if(!da_ju(i+1)){     //s[i]是小写字母,且紧跟在后的也是小写字母,此时要关闭 caps;
                caps=0;
                return 1;
            }
        }
    }
    else{//caps未开
        if(da_ju(i)&&da_ju(i+1)) {  //caps未开,s[i]是大写字母,且紧跟在后的s[i+1] 也是大写字母,此时要打开caps;
            caps=1;
            return 3;    // caps的关闭操作始终归于使得caps打开的那个大写字母;
			  //实际上caps并未关闭,但它的关闭操作的按键数已经在打开时的同时就被计
			//数在内了,以后再关闭caps时,只需要修改caps的值即可(即caps=0),而不需要再计算操作数 !!!!
        }
        else if(da_ju(i)){  // s[i]是大写,而s[i+1]是小写,执行: shift+s[i]
            return 2;
        }
        else return 1;  //s[i]是小写字母,s[i+1]也是小写字母
    }  

}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        caps=0;
        scanf("%s",s);
        int len=strlen(s);
            s[len]='\0';
        int res=0;
        for(int i=0;i<len;++i){
            res+=fun(i);
        }
        printf("%d\n",res);
    }
    return 0;
}  

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 13:42:19

hdoj-2577-How to Type (最少按键次数)的相关文章

HDU 2577 How to Type (线性dp)

How to Type Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4616    Accepted Submission(s): 2084 Problem Description Pirates have finished developing the typing software. He called Cathy to tes

HDU 2577 How to Type(模拟)

题目链接  http://acm.hdu.edu.cn/showproblem.php?pid=2577 题意   给你一个由大写字母和小写字母组成的字符串  模拟键盘输入的最少按键次数 直接模拟每个字符的输入  flag表示capslock的状态  1表示打开  0为关闭  开始是和输入完毕都是关闭的关闭的  用plu记录shift和capslock的按键次数 当接下来输入的字母有连续n个跟capslock状态不同时  分析可只  只有n=1时适合用shift键 如flag=1 n=1  输入

hdu 2577 How to Type 如何保证英文输入状态下,可以按最小次数来完成输入

How to Type Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3704    Accepted Submission(s): 1697 Problem Description Pirates have finished developing the typing software. He called Cathy to tes

HDU 2577 How to Type(dp题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577 解题报告:有一个长度在100以内的字符串,并且这个字符串只有大写和小写字母组成,现在要把这些字符串用键盘输入到电脑中,一开始的时候大写锁定是关闭的,并且要求结束的时候也是关闭的,然后让你求输入这些字符串最少需要按多少次键盘(包括Cap Lock键和Shift键) 一个典型的dp题,定义一个一维数组就够了,然后dp[i]的含义的输入到第i个字符时需要按键的最少次数.然后递推公式如下: dp[i]

HDU 2577 How to Type【DP】

题意:给出一个字符串,有大写有小写,问最少的按键次数.然后打字的这个人有一个习惯,打完所有的字之后,指示灯要关闭. dp[i][j]表示打到第i个字母,j有0,1两个值表示指示灯开或者关的状态 然后就可以写出状态转移方程了,因为最后需要灯是灭的,所以最后在找最小值的时候,dp[len][1]需要加1 又一次看的题解===go--go 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #includ

1、对一个正整数算到1需要的最少操作次数

题1:实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去:例子:func(7) = 4,可以证明最少需要4次运算n = 7n-1 6n/2 3n-1 2n/2 1 要求:实现函数(实现尽可能高效) int func(unsign int n):n为输入,返回最小的运算次数.给出思路(文字描述),完成代码,并分析你算法的时间复杂度. java源程序: package bfgy.lab.work; import 

数据结构实验3(飞机最少环城次数问题)

使用图算法解决应用问题: 设有n个城市, 编号为0 ~ n - 1, m条航线的起点和终点由用户输入提供. 寻找一条换乘次数最少的线路方案. 使用有向图表示城市间的航线, 只要两城市之间有航班, 则图中这两点间存在一条权为1的边. 用Dijkstra算法实现求最少换乘次数. 在MGraph类中增加Choose函数以及Dijkstra函数即可. 实现代码: #include "iostream" #include "cstdio" #include "cst

最少乘法次数

最少乘法次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次: 输入 第一行m表示有m(1<=m<=100)组测试数据: 每一组测试数据有一整数n(0<n<=10000); 输出 输出每组测试数据所需次数s; 样例输入 3234 样例输出 122 最少乘法次数

最少的次数

2191: 最少的次数 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 553  Solved: 73[Submit][Status][BBS] Description 这一天,成都东软学院ACM团队举办了一场游戏.游戏是这样的: 在桌上有一堆糖,其中有一颗糖与其他糖外观一模一样,但重量却明显轻.现在得知桌上共有N颗糖,还有一个天平,问最少需要多少次一定能准确的找出该糖?今天作为比赛中的你,相信这一问题应该不是什么难事,加油吧! Input 第一行包