【笔试】美团·最长全1串 C++

题目:给你一个01字符串,定义答案=该串中最长的连续1的长度,现在你有至多K次机会,每次机会可以将串中的某个0改成1,现在问最大的可能答案

输入描述:

输入第一行两个整数N,K,表示字符串长度和机会次数
第二行输入N个整数,表示该字符串的元素( 1 <= N <= 300000, 0 <= K <= N )

输出描述

输出一行表示答案。

输入例子1:

10 2 
1 0 0 1 0 1 0 1 0 1

输出例子1:

5

分析:后面有时间再补。

Show me the code:

// by 阮的名
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <queue>
using namespace std;

void split(const string &s, char sep, vector<int> &ret) {
    stringstream ss(s);
    string item;
    while(getline(ss, item, sep)) {
        stringstream ss2(item);
        int tmp;
        ss2 >> tmp;
        ret.emplace_back(tmp);
    }
}

class Solution {
public:
    Solution(vector<int> s, int k):m_s(std::move(s)),m_k(k) {
        for(unsigned int i=0;i<m_s.size();i++) {
            if(m_s[i]==0)
                m_zeroPos.emplace_back(i);
        }
    }

    int fillMax() {
        if(m_zeroPos.size()<m_k)
            return m_s.size();
        unsigned int start = 0;
        unsigned int end = start+m_k;
        int max = 0 ;
        while(start!=(m_zeroPos.size()-m_k+1)) {
            int tmp = count(start, end);
            max = max>tmp?max:tmp;
            start++;
            end++;
        }
        return max;
    }

    int count(unsigned int start, unsigned int end) {
        int s_start = 0;
        if(start)
            s_start = m_zeroPos[start-1]+1;
        int s_end = m_zeroPos[end];
        if(end>=m_zeroPos.size())
            s_end = m_s.size()-1;
        return s_end-s_start;
    }


private:
    vector<int> m_s;
    deque<int> m_zeroPos;
    int m_k;
};

int main() {
    string input;
    getline(cin, input);
    vector<int> parameter;
    split(input, ' ', parameter);
    int N = parameter[0];
    int K = parameter[1];
    vector<int> bitArray;
    bitArray.reserve(N);
    getline(cin, input);
    split(input, ' ', bitArray);
    Solution s(bitArray, K);
    cout << s.fillMax() << endl;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值