题目大意:
给定一个数组a(1<=a[i]<=4),和一个整数k,要求一个区间[l,r],区间中至少包括有一个“1”,一个“2”,一个“3”,k个“4”;最后输出区间的长度。
样例1:
6 2
4 1 1 4 2 3
输出:
6
样例2:
8 2
4 2 3 4 1 1 4 2
输出:
5
思路:
创建一个数组cnt[],储存区间内各个数出现的次数,l,r表示区间的左右边界;将r向右移动,当满足区间要求时,l向右移动,当每一次满足时,记录下此时区间的长度(r-l+1),之后判断与上次满足的长度,取得区间长度的最小值。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005] = {0};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
ll n, k, r = 0, l = 0, minn = 100005;
ll cnt[5] = {0};
cin >> n >> k;
for (ll i = 1; i <= n; i++) cin >> a[i];
while (r <= n) {
while (cnt[1] < 1 || cnt[2] < 1 || cnt[3] < 1 || cnt[4] < k) {
r++;
cnt[a[r]]++;
if (r > n) break;
}
while (cnt[1] >= 1 && cnt[2] >= 1 && cnt[3] >= 1 && cnt[4] >= k) {
l++;
cnt[a[l]]--;
if (l > r) break;
}
minn=min(minn,r-l+1);
}
cout << minn << endl;
return 0;
}