洛谷.P3741 honoka的键盘(dalao勿进,纯属错题笔记)

题目背景
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中(洛谷)

填坑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值