题目
【补种未成活胡杨】
近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。
一个月后,有M棵胡杨未能成活。
现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?
输入描述
N 总种植数量
M 未成活胡杨数量
M 个空格分隔的数,按编号从小到大排列
K 最多可以补种的数量
其中:
1 <= N <= 100000
1 <= M <= N
0 <= K <= M
输出描述
最多的连续胡杨棵树
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5
2
2 4
1
输出
3
说明
补种到2或4结果一样,最多的连续胡杨棵树都是3。
示例2
输入
10
3
2 4 7
1
输出
6
说明
补种第7棵树,最多的连续胡杨棵树为6(5,6,7,8,9,10)
思路
1:滑动窗口
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> vec(N,1);
int k;
for(int i = 0; i < M; i++) {
cin >> k;
vec[k - 1] = 0;
}
cin >> k;
int left = 0;
int right = 0;
int count = 0;
int maxlen = 0;
while(right < vec.size()) {
if(vec[right] == 0) {
count++;
}
while(count > k) {
if(vec[left++] == 0) {
count--;
}
}
maxlen = max(maxlen, right - left + 1);
right++;
}
cout << maxlen << endl;
system("pause");
return 0;
}