Binary Deque
题面翻译
有多组数据。
每组数据给出 n n n 个数,每个数为 0 0 0 或 1 1 1 。你可以选择从两边删数,求至少删几个数才可以使剩下的数总和为 s s s 。
如果不能达到 s s s ,则输出 − 1 -1 −1 。
题目描述
Slavic has an array of length $ n $ consisting only of zeroes and ones. In one operation, he removes either the first or the last element of the array.
What is the minimum number of operations Slavic has to perform such that the total sum of the array is equal to $ s $ after performing all the operations? In case the sum $ s $ can't be obtained after any amount of operations, you should output -1.
样例 #1
样例输入 #1
7
3 1
1 0 0
3 1
1 1 0
9 3
0 1 0 1 1 1 0 0 1
6 4
1 1 1 1 1 1
5 1
0 0 1 1 0
16 2
1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1
6 3
1 0 1 0 0 0
样例输出 #1
0
1
3
2
2
7
-1
cpp
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int t, n, m;
int w[2000005];
int main()
{
cin >> t;
while (t--)
{
int num1 = 0, num2 = 0, temp = 0,sum=0;
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> w[i],sum += w[i];
if (sum < m){//特判
cout << -1 << endl;结束
continue;
}
int num = 0;
int ans = 0;
for (int i = 1, j = 1; i <= n;i++) {
num += w[i];
while (j<i && num>m){
//双指针前后符合并且和太大了就做减法
num -= w[j++];//减去
}
if (num == m){
ans = max(ans, i - j + 1);//不断更新
}
}
cout <<n-ans << endl;
}
return 0;
}