起初看到这个题目,思路是先找到VK的个数,并对VK做一下标记,然后再找第一个V,直接res++,然后break就行了。然而提交之后74,百思不得其解,通过查看讨论别人的提问和解答才明白,原来漏掉了KK的情况,且之前查找VV的情况也有问题。
那么,这道题的整体思路是先找没改变之前的VK,然后再找第一个VV或KK(至多改变一个字符)。
如何查找VK、VV、KK呢?我个人比较喜欢数字,所以我新开了个数组a[N],并在输入字符串的时候对该数组定义,即当字符为V的时候 a[i]=1;当字符为K的时候 a[i]=2。思路:先找没改变之前的VK,找到之后,结果数res++,并且标记VK对应的数组中的值为0,表示用过了;然后再找第一个VV或KK,即找数组中有没有相邻都为1或都为2的,如果有结果数res++,并且break(只能改变一个);最后输出res。
具体代码如下:
```c
#include<iostream>
using namespace std;
const int N=110;
char s[N];
int a[N];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){//输入字符串并定义a数组
cin>>s[i];
if(s[i]=='V')a[i]=1;
else if(s[i]=='K')a[i]=2;
}
int res=0;
for(int i=0;i<n-1;i++){//先找没改变之前的VK(注意临界)
if(a[i]==1&&a[i+1]==2){//如果a数组中存在相邻的1,2序列,更新结果
res++;
a[i]=0;//标记已经找到的VK
a[i+1]=0;
}
}
for(int i=0;i<n-1;i++){//然后再找第一个VV或KK
if((a[i]==1&&a[i+1]==1)||(a[i]==2&&a[i+1]==2)){//如果a数组中存在相邻的1,1序列或2,2序列,更新结果
res++;
break;//最多改变一次,所以如果找到一个就退出循环
}
}
cout<<res<<endl;//输出结果
return 0;
}
```
by timmyliao @ 2024-01-14 10:18:39
@[timmyliao](/user/1095093) 万分感谢大佬!!!!!!
by hzy_Q @ 2024-01-14 17:24:01