#1311. 双子段最小和

    ID: 1311 传统题 1000ms 256MiB 尝试: 4 已通过: 2 难度: 普及 上传者: 标签>基础算法前缀和贪心哈希表

双子段最小和

题目描述

给定一个长度为 NN 的非负整数数组 B1,B2,…,BNB_1, B_2, \dots, B_N。

你需要从数组中选择至多两个互不重叠的连续子段,使得这些子段中所有元素的总和恰好等于给定的目标值 KK。

请计算出,在满足条件的情况下,这两个连续子段所包含的元素总数(即子段长度之和)最小是多少?如果无法找到满足条件的子段组合,请输出 -1。

输入格式

第一行包含一个正整数 TT —— 表示测试用例的数量。

对于每个测试用例:

  • 第一行包含两个正整数 NN 和 KK —— 分别表示数组的长度和目标总和。
  • 第二行包含 NN 个非负整数 B1,B2,…,BNB_1, B_2, \dots, B_N —— 表示数组的元素。

输出格式

对于每个测试用例,输出一行,格式为 Case #x: y,其中 x 是测试用例编号(从 11 开始),y 是所需的最少元素总数。如果不可能实现,则 y 为 -1。

样例输入 1

4
6 8
1 2 3 1 2 3
4 10
6 7 5 2
6 8
3 1 2 1 3 1
4 6
3 1 2 0

样例输出 1

Case #1: 3
Case #2: -1
Case #3: 4
Case #4: 3

说明

样例解释

  • 在样例 11 中,第一个子段可以选择下标为 22 和 33 的元素(值为 22 和 33),第二个子段可以选择下标为 66 的元素(值为 33)。总和为 2+3+3=82+3+3=8,总长度为 2+1=32+1=3。
  • 在样例 22 中,无法用至多 22 个连续子段得到总和 1010。
  • 在样例 33 中,第一个子段可以选择下标为 1,21, 2 的元素(值为 3,13, 1),第二个子段可以选择下标为 5,65, 6 的元素(值为 3,13, 1)。总和为 3+1+3+1=83+1+3+1=8,总长度为 44。注意:我们不能取 3+2+33 + 2 + 3 的组合(对应下标 1,3,51, 3, 5 的元素),因为这需要 33 个连续子段,不符合题意。
  • 在样例 44 中,选择单个子段包含下标 1,2,31, 2, 3 的元素(值为 3,1,23, 1, 2),总和为 66,总长度为 33。

数据范围

对于所有测试点,保证:

  • 1≤T≤51 \le T \le 5。
  • 1≤N≤50001 \le N \le 5000。
  • 1≤K≤1061 \le K \le 10^6。
  • 0≤Bi≤K0 \le B_i \le K(1≤i≤N1 \le i \le N)。
  • 保证所有的输入数值均为整数。