P3741 小果的键盘 答案详解

题目背景

小果有一个只有两个键的键盘。

题目描述

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

输入格式

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

第二行给出一个字符串 ss。

输出格式

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

输入输出样例

输入 #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

答案及解析

看完输入格式直接就可以敲代码了,先把输入部分拿下

    int n;
    string s;
	scanf("%d",&n);
	cin>>s;

因为1<=n<=100,所以用int可以直接解决,不用long long int。

再次读题,题目要求是请计算她最多能使这个字符串内出现多少次 VK,且输入的字符串只存在V或K,所以我们可以把这道题的思路分为两部分

  一,计算字符串中子串VK的数量

  二,改变后VK的数量

首先完成第一步:(解析看注释)

for(int i=0;i<n-1;i++){//s字符串的范围是s[0]~s[n-1],由于代码中需要判断该字符的下一位是否为‘K',所以i只运行到n-2
		if(s[i]=='V'&&s[i+1]=='K'){//查找VK
			sum++;//找到VK,sum加1
			s[i]='X',s[i+1]='X';//将找到的数推翻,保证不会重复计算
			i++;//s[i+1]已被推翻,从s[i+2]继续遍历,可以节省时间
		}
	}

接着再做第二步:

写代码前,我们先要分析改变的规则

  因为需要将原子串改变为’VK',所以一次改变至少需要两个字符

  这两个字符有3种排列可能,即 VV , KK , KV (:VK已经被推翻了)

  当子串为KV时,ta不可能在只修改一次的情况下变为KV,所以不对ta进行判断和操作

  所以判断子串为 VV , KK 的判断条件为

s[i]!='X'&&s[i]==s[i+1]

 如果条件成立,便可以输出sum+1的值

如果无成立条件,最后输出sum

ok啊,好吧,直接上xdm最喜欢的代码(解析都在上面,这次我就不写注释了。。。绝对不是懒,嘿嘿 >_<)

#include <bits/stdc++.h>
using namespace std;
int n,sum;
int main(){
	string s;
	scanf("%d",&n);
	cin>>s;
	for(int i=0;i<n-1;i++){
		if(s[i]=='V'&&s[i+1]=='K'){
			sum++;
			s[i]='X',s[i+1]='X';
			i++;
		}
	}
	for(int i=0;i<n-1;i++){
		if(s[i]!='X'&&s[i]==s[i+1]){
			sum++;
			cout<<sum;
			return 0;
		}
	}
	cout<<sum;
	return 0;
}

最后再加亿点细节,给代码简化一下

(备注一下:++放前面是先将变量加1,再运行代码,放后面则相反)

#include <bits/stdc++.h>
using namespace std;
int n,sum;
int main(){
	string s;
	scanf("%d",&n);
	cin>>s;
	for(int i=0;i<n-1;i++)
		if(s[i]=='V'&&s[i+1]=='K')
		    sum++,s[i]='X',s[++i]='X';
	for(int i=0;i<n-1;i++){
		if(s[i]!='X'&&s[i]==s[i+1]){
			cout<<++sum;
			return 0;
		}
	}
	cout<<sum;
	return 0;
}

啊啊啊啊啊啊,看在作者打这么多字的份上,留下点赞加关注吧,求求了~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值