【洛谷】P3741 honoka的键盘(暴力)
P3741 honoka的键盘
题目背景
honoka 有一个只有两个键的键盘。
题目描述
一天,她打出了一个只有这两个字符的字符串。当这个字符串里含有"VK"这个字符串的时候,honoka 就特别喜欢这个字符串。所以,她想改变至多一个字符(或者不做任何改变)来最大化这个字符串内"VK"出现的次数。给出原来的字符串,请计算她最多能使这个字符串内出现多少次"VK"。(只有当"V"和"K"正好相邻时,我们认为出现了"VK"。)
输入输出格式
输入格式:
第一行给出一个数字 n,代表字符串的长度。第二行给出一个字符串 s。
输出格式:
第一行输出一个整数代表所求答案。
输入输出样例
说明
对于 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; }
既然无能更改,又何必枉自寻烦忧