福州大学算法作业题 - 游戏王

游戏王
★实验任务

小茗同学又在玩游戏了一一Yu Gi 0h。

小茗同学目前有N只怪兽在场上,这N只怪兽排成一~排。每只怪兽有两个状态一一攻击状态(A)和防御状态(D)。

小茗同学手上有一张魔法卡,可以根据连续的状态一致的怪兽数量来恢复HP。在发动魔法卡前,小茗同学能改变最多M只怪兽的状态,即从攻击状态变为防御状态和从防御状态变为攻击状态。

由于怪兽的数量太多,小茗同学想让你帮他找出他能恢复HP的最大值。

★数据输入

第一行 输入两个整数 N, M ,分别表示怪兽数量和改变状态的数量。
第二行 输入一个长为 N的字符串,该字符串仅由 ’A’ 和’D’ 组成 (大写的 字母 A和字母 D)。

★数据输出 数据输出

输出小茗同学最多能恢复少 HP 。

★数据范围 数据范围

50 %的得分点, 1≤N≤10080 %的得分点, 1≤N≤200 0100 %的得分点, 1≤M≤N≤100,000

思路:

采用尺取法。

不是全部转化成a就是转化成b,然后取这两种情况中的最大值即可。用一个数组来存位置。

#include<iostream>
#include<string>
#define n 100000 
using namespace std;
int N,M,q[n];
string s;
int main()
{
    cin>>N>>M; 
    cin>>s;
    int  HP,head,tail,st;
    HP=head=tail=st=0;
    for(int i=0;i<N;i++)//改D
    {
        if(s[i]=='D') //如果是D
        {
            q[tail] = i;
            tail++;
        }        //记录第tail+1个D的位置
        if(tail-head>M) //如果改变的D的数量大于M
        {
            st=q[head]+1;
            head++;
        }        //最左边的D不改变,空出一个改变的次数
        if(HP<i-st+1)
        HP = i-st+1;
        if(HP>i-st+1)
        HP = HP; //此时的A串长度即为i-st+1
    }   
    head=tail=st=0;
    for(int j=0;j<N;j++)//改A ,同上
    {
        if(s[j]=='A'){
            q[tail] = j;
            tail++;
        }
        if(tail-head>M){
            st=q[head]+1;
            head++;
        }
        if(HP<j-st+1)
        HP = j-st+1;
        if(HP>j-st+1)
        HP=HP;
    }
    
    cout<<HP<<endl;
    return 0;
 } 

猜你喜欢

转载自www.cnblogs.com/YD2018/p/9716522.html