向前走莫回头❤

【洛谷】P3741 honoka的键盘(暴力)

P3741 honoka的键盘

题目背景

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

题目描述

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

输入输出格式

输入格式:

 

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

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制
2
VK
输出样例#1: 复制
1
输入样例#2: 复制
2
VV
输出样例#2: 复制
1
输入样例#3: 复制
1
V
输出样例#3: 复制
0
输入样例#4: 复制
20
VKKKKKKKKKVVVVVVVVVK
输出样例#4: 复制
3
输入样例#5: 复制
4
KVKV
输出样例#5: 复制
1

说明

对于 100%的数据,1<=n<=100 。

【题解】【分三种情况判断:①当前位是V,下一位是K;②当前位是V,下一位不是K但更换成K;③当前位是K,前一位不是V,将前一位转变成V,但要考虑前一位是否与再前面的一位已构成VK并计入计数器了。

注意判断临界,i注意至多只能改变一个字符!所以在第二三种情况时,每一次枚举改变一字符都要将后面所有的VK枚举完作为当前情况的答案】

#include<cmath>
#include<cstdio>
#include<cstdlib> 
#include<cstring>
#include<iostream>
using namespace std;
char ch[110];
int num,sum,n;
bool p[110];
int main(){
    int i,j;
    scanf("%d\n",&n);
    gets(ch); i=0;
    memset(p,1,sizeof(p));
    while(i<n)
     {
         if(ch[i]=='V'&&ch[i+1]=='K') num++,p[i]=0,p[i+1]=0,i++;
         if(p[i]&&p[i+1]&&ch[i]=='V'&&ch[i+1]!='K'&&i+1<n)
          {
              int t; t=num+1;
              for(j=i+2;j<n-1;++j)
              if(ch[j]=='V'&&ch[j+1]=='K') t++;
            sum=max(sum,t);
          }
        if(p[i]&&p[i-1]&&ch[i]=='K'&&i>0&&ch[i-1]!='V')
         {
             int t; t=num+1;
             for(j=i+1;j<n;++j)
              if(ch[j]=='V'&&ch[j+1]=='K') t++;
             sum=max(sum,t);
         }
        i++;
     }
    sum=max(sum,num);
    printf("%d\n",sum);
    return 0;
}

 

posted @ 2018-08-06 11:24  lris0-0  阅读(830)  评论(0编辑  收藏  举报
过去的终会化为美满的财富~o( =∩ω∩= )m