P3741 honoka的键盘

题目背景

honoka 有一个只有两个键的键盘。

题目描述

一天,她打出了一个只有这两个字符的字符串。当这个字符串里含有 VK 这个字符串的时候,honoka 就特别喜欢这个字符串。所以,她想改变至多一个字符(或者不做任何改变)来最大化这个字符串内 VK 出现的次数。给出原来的字符串,请计算她最多能使这个字符串内出现多少次 VK(只有当 VK 正好相邻时,我们认为出现了 VK。)

输入格式

第一行给出一个数字 n n n,代表字符串的长度。

第二行给出一个字符串 s s s

输出格式

第一行输出一个整数代表所求答案。

1.题目分析

输入一段指定长度的字符串,计算出现VK的次数,可以修改一次,是VK的数量最大化。
值得一提的是,需要先把字符串中的VK去除,再遍历,找到VV或者KK,计数一次,跳出循环即可。
去除的目的是为了,寻找KK和VV时,不影响结果的判断。

2.题目思路

输入一段字符串,判断相邻两个字符是否为VK,如果是,将这两个元素置为零,计数器加一。
第二轮循环,判断剩余元素中是否出现KK和VV,出现说明可以修改一次,得到VK,让计数器加一后跳出循环。

值得一提的是,要杜绝数组索引越界的情况。

3.代码演示

#include 

int main() {
    int n;
    scanf("%d", &n);
    char str[n];
    scanf("%s", str);
    int cnt = 0;
    for (int i = 0; i < n; ++i) {
        //统计VK的数量
        //防止索引越界
        if (i + 1 < n) {
            if (str[i] == 'V' && str[i + 1] == 'K') {
                cnt++;
                //把VK消除
                str[i] = 0;
                str[i + 1] = 0;
            }
        }
    }

    for (int i = 0; i < n; ++i) {
        //修改vv kk的情况
            //防止索引越界
            if (i + 1 < n) {
                //修改 vv 和 kk的情况
                if (str[i] == 'V' && str[i + 1] == 'V') {
                    cnt++;
                    break;
                } else if (str[i] == 'K' && str[i + 1] == 'K') {
                    cnt++;
                    break;
                }

        }
    }

    printf("%d", cnt);
    return 0;
}

你可能感兴趣的:(刷题go,go,go,算法,c语言)