2019美团校招 编程题 最长全1串

    xiaoxiao2025-04-08  15

    时间限制:2秒

    空间限制:131072K

    给你一个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

     

    这道题目有一定难度,思路是将所有0的位置存下来,然后用滑窗的方法解决。

    #include <iostream> #include <vector> using namespace std; const int N = 300010; int arr[N]; int main() { int n,k; vector<int> res; cin>>n>>k; for(int i=0;i<n;i++){ cin>>arr[i]; if(arr[i]==0) res.push_back(i); } // 0的个数小于k if(res.size()<=k){ cout<<n<<endl; return 0; } // 全是0 if(res.size()==n){ cout<<k<<endl; return 0; } int maxlen = 0; /*if(k==0){ int count = 0; for(int i=0;i<n;i++){ if(arr[i]==1) count++; else count=0; maxlen=max(maxlen,count); } cout<<maxlen<<endl; return 0; }*/ for(int i=0;i<res.size()-k;i++){ if(i==0){ maxlen = res[i+k]; } else{ maxlen =max(maxlen,res[i+k]-res[i-1]-1); cout<<maxlen<<endl; } } cout<<maxlen<<endl; system("pause"); return 0; }

     

    最新回复(0)