E. Binary Deque[双指针好思维题]

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;
}
相关推荐
软件派6 小时前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
ZhengEnCi14 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
吞下星星的少年·-·17 小时前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
aichitang202418 小时前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码18 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-18 小时前
两数之和-C++实现
c++·算法
j7~18 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号19 小时前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯
揽星河..19 小时前
【C++】类和对象
c++·算法