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. python bytecode解析

    python bytecode解析 前言 我们的电脑是怎么运行的呢?计算机内部的 CPU 处理器是个硅片,上面雕刻着精心布置的电路,输入特定的电流,就能得到另一种模式的电流,而且模式可以预测,给这些模 ...

  2. php几种常用的算法

    1 <?php 2 3 // 选择排序 4 5 function select_sort($arr) 6 7 { 8 9 $count = count($arr); 10 11 for ($i ...

  3. games101_Homework3

    在Raster部分实现数值插值,然后实现四种不同的像素着色器 作业描述: 作业1:修改函数 rasterize_triangle(const Triangle& t) in rasterize ...

  4. Codeforces Round 891 (div.3) D题解析

    CodeForces Round 898 (div 4) D题.Strong Vertices 大致思路 对于题目的给的式子,au-av>=bu-bv,我们可以通过移项得到au-bu>=a ...

  5. HarmonyOS-Chat聊天室|纯血鸿蒙Next5 api12聊天app|ArkUI仿微信

    自研原生鸿蒙NEXT5.0 API12 ArkTS仿微信app聊天模板HarmonyOSChat. harmony-wechat原创重磅实战纯血鸿蒙OS ArkUI+ArkTs仿微信App聊天实例.包 ...

  6. Ubuntu 重启后 wifi 图标不见了 连不上网

    今天重启了一下电脑,结果wifi图标不见了,打开浏览器,无法联网.想了办法用网线先连上网,去网上找了找,说让我执行 sudo service network-manager restart 但是我执行 ...

  7. php 如何实现 git diff

    无意间想到这个问题,如何用php来实现git diff,如果实现了这个功能,岂不是能够使用php对在线编辑文件的功能做更进一步的优化和提升? 查了一下还真有这样的库,话不多说,开始执行 compose ...

  8. 原生鸿蒙中的RN日志系统

    一.创作背景 在上一篇博客中,我分享了在原生鸿蒙中,进行RN的热加载,以达到修改RN代码后不需要重新打包,即可实时调试的效果. 本次我将分享一下RN的日志系统,以及对js中线上bug的监听,希望能对大 ...

  9. Vim之PHP语法检查

    在Linux下操作,一般都是使用vim进行文本编辑, 这个时候有可能不小心就会出现语法异常,导致程序错误 手动检查: 1) 编辑完成之后, 回到命令行下执行 php -l test.php 如果语法校 ...

  10. 第十四届蓝桥杯省赛C++B组--接龙序列

    接龙序列 我们称序列中\(a_i\)的首位数字恰好是\(a_{i-1}\)的末尾数字,这样的序列叫做接龙序列,比如12 23 35 57,所有长度为1的整数序列都是接龙序列,现在给定一个长度为\(n\ ...