14.Binary Deque

题面翻译

Binary Deque - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

有多组数据。

每组数据给出 \(n\) 个数,每个数为 \(0\) 或 \(1\) 。你可以选择从两边删数,求至少删几个数才可以使剩下的数总和为 \(s\) 。

如果不能达到 \(s\) ,则输出 \(-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.

输入格式

The first line contains a single integer $ t $ ( $ 1 \leq t \leq 10^4 $ ) — the number of test cases.

The first line of each test case contains two integers $ n $ and $ s $ ( $ 1 \leq n, s \leq 2 \cdot 10^5 $ ) — the length of the array and the needed sum of elements.

The second line of each test case contains $ n $ integers $ a_i $ ( $ 0 \leq a_i \leq 1 $ ) — the elements of the array.

It is guaranteed that the sum of $ n $ over all test cases doesn't exceed $ 2 \cdot 10^5 $ .

输出格式

For each test case, output a single integer — the minimum amount of operations required to have the total sum of the array equal to $ s $ , or -1 if obtaining an array with sum $ s $ isn't possible.

样例 #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

提示

In the first test case, the sum of the whole array is $ 1 $ from the beginning, so we don't have to make any operations.

In the second test case, the sum of the array is $ 2 $ and we want it to be equal to $ 1 $ , so we should remove the first element. The array turns into $ [1, 0] $ , which has a sum equal to $ 1 $ .

In the third test case, the sum of the array is $ 5 $ and we need it to be $ 3 $ . We can obtain such a sum by removing the first two elements and the last element, doing a total of three operations. The array turns into $ [0, 1, 1, 1, 0, 0] $ , which has a sum equal to $ 3 $ .

思路:

本题可以使用双指针来动态获取最优解,我们可以先计算出所有元素之和sum,若sum小于s,则不可能达到目标,输出-1并接着处理下一个样例,若s==sum,则正好操作次数为0,可以输出0并直接返回。否则,我们使用双指针的思路,此处为快慢指针,我们维护一个动态区间。

  1. 若这个动态区间内的元素之和sum=s,则我们此时更新答案,并让快指针向右走
  2. 若这个动态区间内的元素之和 sum<s,则我们需要扩大区间范围,此时让快指针r接着向右走
  3. 若这个动态区间内的元素之和sum>s,则我们需要缩小区间范围,找到最优的答案。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,s;
int a[N];
void solve(){
int n,s;
cin>>n>>s;
int sum=0;
//先计算所有的元素之和,若所有元素之和还小于s,则不可能达到目标,若刚好等于s,则操作次数为0次。
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
if(sum<s){
cout<<-1<<"\n";
return;
}
if(sum==s){
cout<<0<<'\n';
return;
}
sum=a[1];
int l=1,r=1,ans=1e10;
while(r<=n&&l<=r){
//若当前区间的和等于s,则此时更新答案,并且让快指针接着往后走
if(sum==s){
//当前所需要删除的数的个数为:总个数n-区间的长度。
ans=min(ans,n-(r-l+1));
r++;
sum+=a[r];
}
//若当前区间的和小于s,则让快指针向右走,扩大区间的范围。
if(sum<s){
r++;
sum+=a[r];
}
//若当前区间的和大于s,则让慢指针向右走,减少区间的长度,看看能不能达到最优的答案,
//注意这里是先减去a[l],再让l++,与上面不同。
if(sum>s){
sum-=a[l];
l++;
}
}
cout<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t=1;cin>>t;
while(t--) solve();
return 0;
}

双指针习题:Binary Deque的更多相关文章

  1. 《算法导论》习题2.3-5 二分搜索 Binary Search

    地球人都知道“二分查找”,方法也非常简单,但是你能不能在10分钟内写出一个没有bug的程序呢? 知易行难,自己动手写一下试一试吧. public class BinarySearch { public ...

  2. [LeetCode] Recover Binary Search Tree 复原二叉搜索树

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  3. [LeetCode] Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  4. LeetCode——Serialize and Deserialize Binary Tree

    Description: Serialization is the process of converting a data structure or object into a sequence o ...

  5. Serialize and Deserialize Binary Tree

    Design an algorithm and write code to serialize and deserialize a binary tree. Writing the tree to a ...

  6. 【转】STL之二分查找 (Binary search in STL)

    Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第4 ...

  7. LeetCode Binary Tree Right Side View (DFS/BFS)

    题意: 给一棵二叉树,要求收集每层的最后一个节点的值.按从顶到底装进vector返回. 思路: BFS比较简单,先遍历右孩子就行了. /** * Definition for a binary tre ...

  8. leetcode 144. Binary Tree Preorder Traversal ----- java

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  9. leetcode 103 Binary Tree Zigzag Level Order Traversal ----- java

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  10. 【Binary Tree Zigzag Level Order Traversal】cpp

    题目: Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from lef ...

随机推荐

  1. pwn V8入门

    V8入门 && StarCTF oob 搭建环境的步骤如下: 环境搭建 #depot_tools git clone https://chromium.googlesource.com ...

  2. SSIS ODBC方式连接mysql数据库

    系统环境:WIN 10 64位 1.安装Mysql odbc connector 插件 文章说明链接: https://www.cnblogs.com/santiagoMunez/p/4780301. ...

  3. 初识GO语言--基本规则

  4. 2个月搞定计算机二级C语言——真题(7)解析

    1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题7 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> int fun(char* s, ...

  5. SpreadJS 在数据填充时的公式填充方案

    需求介绍 很多用户使用了 SpreadJS 的数据填报功能.大致用法为:设计模板,填充数据源.在这个过程中,可能会出现模板中设置了公式,而在数据源填充时,公式没有携带下来的问题. 比如我们定义一个模板 ...

  6. MoD:轻量化、高效、强大的新型卷积结构 | ACCV'24

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: CNN Mixture-of-Depths 论文地址:https://arxiv.org/abs/2409.17016 创新点 提出新的卷积轻 ...

  7. 读书笔记-C#8.0本质论-05

    18.3 基于任务的异步编程模式 18.3.1 使用任务并行库(TPL)实现异步执行高延迟操作 using System; using System.Net.Http; using System.Th ...

  8. Spring + EHcache配置

    需要使用Spring来实现一个Cache简单的解决方案,具体需求如下:使用任意一个现有开源Cache Framework,要求可以Cache系统中Service或则DAO层的get/find等方法返回 ...

  9. Phpstorm之快捷键

    常用快捷键 1.ctrl+alt+s 快速打开setting系统设置 2.CTRL+/ 单行注释/取消注释 CTRL+SHIFT+/ 块状注释/取消块状注释 3.方法体上面打入'/**' 再按回车键 ...

  10. 【分块】LibreOJ 6277 数列分块入门1

    前言 分块是一种优雅的暴力,将数组按块长 \(\sqrt{n}\) 进行分块,可实现区间加法.区间求和和区间逆序对计数等场景,进行 \(m\) 次操作的时间复杂度:\(O(m\sqrt{n})\). ...