题目背景
honoka 有一个只有两个键的键盘。
题目描述
一天,她打出了一个只有这两个字符的字符串。当这个字符串里含有"VK"这个字符串的时候,honoka 就特别喜欢这个字符串。所以,她想改变至多一个字符(或者不做任何改变)来最大化这个字符串内"VK"出现的次数。给出原来的字符串,请计算她最多能使这个字符串内出现多少次"VK"。(只有当"V"和"K"正好相邻时,我们认为出现了"VK"。)
输入格式
第一行给出一个数字 n,代表字符串的长度。第二行给出一个字符串 s。
输出格式
第一行输出一个整数代表所求答案。
这道题很水很水,写在这里主要是给自己长长记性,关于数组的范围检查
这一方面;
思路就是:在数组中排查“VK”,“VV”,“KK“,这三种小情况,两大种情况:(”VK“,权值+1,else ,改变后权值+1)
一血:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<queue>
#define PI 3.1415926535
#include<functional>
#include<vector>
#include <iostream>
using namespace std;
typedef long long ll;
const int maxn=3e4+10;
const ll _INF = -8e18;
const int N = 1e5 + 10;
bool cmp(ll a,ll b)
{
return a>b;
}//从大到小
/*struct node
{
int num;
bool k;
} a[101];*/
int n,a[101],b[101],sea;
int main()
{
char s[101];
int k=0;
int i,j;
cin>>n;
cin>>s;
for(i=0;i<n;i++)
if(s[i]=='V'&&s[i+1]!='K')
{
s[i+1]='K';
break;
}
for(i=0;i<n-1;i++)
if(s[i]=='V'&&s[i+1]=='K')
k+=1;
cout<<k<<endl;
return 0;
}/*好吧,第一次WA并不是因为我没处理好数组什么的,因为本蒟蒻没有考虑
到kk这一情况,;*/
int n,a[101],b[101],sea;
int main()
{
char s[101];
int k=0;
int i,j;
cin>>n;
cin>>s;
for(i=0; i<n; i++)
{
if(s[i]=='V'&&s[i+1]!='K')
{
s[i+1]='K';
break;
}
else if(s[i]=='K'&&s[i+1]=='K')
{
s[i]='V';
break;
}
}
for(i=0; i<n-1; i++)
if(s[i]=='V'&&s[i+1]=='K')
k+=1;
cout<<k<<endl;
return 0;
}/*咳咳,同上,没有考虑到重复更改这一问题,例如:VKK,
这种类似情况(双杀)*/
int main()
{
char s[101];
int k=0;
int i,j;
cin>>n;
cin>>s;
for(i=0; i<n-1; i++)
if(s[i]=='V'&&s[i+1]=='K')
{
k+=1;
s[i]='X';
s[i+1]='X';
}
for(i=0; i<n; i++)
{
if(s[i]=='V'&&s[i+1]!='K')
{
s[i+1]='K';
break;
}
else if(s[i]=='K'&&s[i+1]=='K')
{
s[i]='V';
break;
}
}
for(i=0; i<n-1; i++)
if(s[i]=='V'&&s[i+1]=='K')
k+=1;
cout<<k<<endl;
return 0;
}//我真的以为我要对了。。。结果数组多了一位;(又送一头,三杀)
int main()
{
char s[101];
int k=0;
int i,j;
cin>>n;
cin>>s;
for(i=0; i<n-1; i++)
if(s[i]=='V'&&s[i+1]=='K')
{
k+=1;
s[i]='X';
s[i+1]='X';
}
for(i=0; i<n-1; i++)
{
if(s[i]=='V'&&s[i+1]=='V')
{
s[i+1]='K';
break;
}
else if(s[i]=='K'&&s[i+1]=='K')
{
s[i]='V';
break;
}
}
for(i=0; i<n-1; i++)
if(s[i]=='V'&&s[i+1]=='K')
k+=1;
cout<<k<<endl;
return 0;
}
另附dalao代码:
#include<iostream>
using namespace std; //头文件激活;
int main()
{
int n,ans=0,x;//ans记达到条件的数量,要记得清零;
string s;//我们伟大的字符串;
cin>>n;//n是s的长度。
cin>>s;/*因为我们要输入的字符串里只有“V”和“K",
所以用cin就行了;*/
for(x=0;x<n-1;x++)/*字符串的第一位都在是s[0]上,我们
就从0开始判断到n-1,0位上有了就可以到s的长度减一。*/
{
if (s[x]=='V'&&s[x+1]=='K')
{ans++;s[x]='v';s[x+1]='k';}
/*s[x]和s[x+1]是两相邻的字符。
如果条件符合,ans++,
把这两的字符标记成以符合,
注意,两个标记得不能相同。*/
}
for(x=0;x<n-1;x++)//第二步;
if (s[x+1]==s[x]) {ans++;cout<<ans;return 0;}
/*如果相邻两个相同,也就是“VV”或“KK”,就ans加一,
输出答案,结束程序。*/
cout<<ans;//如果没有相邻相同的就输出原来的数。
return 0;//就这样,愉快的结束程序。
}作者: 浩哥_Er中(洛谷)
填坑