CF1868E.Min-Sum-Max
NOI/NOI+/CTSC
通过率:0%
时间限制:5.00s
内存限制:1024MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
Tom is waiting for his results of Zhongkao examination. To ease the tense atmosphere, his friend, Daniel, decided to play a game with him. This game is called "Divide the Array".
The game is about the array a consisting of n integers. Denote [l,r] as the subsegment consisting of integers al,al+1,…,ar.
Tom will divide the array into contiguous subsegments [l1,r1],[l2,r2],…,[lm,rm], such that each integer is in exactly one subsegment. More formally:
- For all 1≤i≤m, 1≤li≤ri≤n;
- l1=1, rm=n;
- For all 1<i≤m, li=ri−1+1.
Denote si=∑k=liriak, that is, si is the sum of integers in the i-th subsegment. For all 1≤i≤j≤m, the following condition must hold:
min_ileklejs_klesum_k=ijs_klemax_ileklejs_k.
Tom believes that the more subsegments the array a is divided into, the better results he will get. So he asks Daniel to find the maximum number of subsegments among all possible ways to divide the array a. You have to help him find it.
汤姆正在等待他的中考成绩。为了缓解紧张的气氛,他的朋友丹尼尔决定和他玩一个游戏,这个游戏叫做“分割数组”。
游戏涉及一个由 n 个整数组成的数组 a。记 [l,r] 为由整数 al,al+1,…,ar 构成的连续子段。
汤姆将把该数组划分为若干个连续子段 [l1,r1],[l2,r2],…,[lm,rm],使得每个整数恰好属于其中一个子段。更准确地说:
- 对所有 1≤i≤m,满足 1≤li≤ri≤n;
- l1=1,rm=n;
- 对所有 1<i≤m,满足 li=ri−1+1。
记 si=∑k=liriak,即 si 是第 i 个子段中所有整数的和。对所有 1≤i≤j≤m,需满足如下条件:
i≤k≤jminsk≤k=i∑jsk≤i≤k≤jmaxsk.
汤姆认为,数组 a 被划分出的子段数量越多,他最终取得的成绩就越好。因此,他请丹尼尔找出在所有合法划分方式中,子段数量的最大值。你需要帮助他求出这个最大值。
输入格式
The first line of input contains a single integer t (1≤t≤50) — the number of test cases. The description of test cases follows.
The first line of each test case contains a single integer n (1≤n≤300) — the length of the array a.
The second line of each test case contains n integers a1,a2,…,an (−109≤ai≤109) — the elements of the array a.
It is guaranteed that the sum of n over all test cases does not exceed 1000.
输入的第一行包含一个整数 t(1≤t≤50),表示测试用例的数量。随后是各测试用例的描述。
每个测试用例的第一行包含一个整数 n(1≤n≤300),表示数组 a 的长度。
每个测试用例的第二行包含 n 个整数 a1,a2,…,an(−109≤ai≤109),表示数组 a 的元素。
保证所有测试用例中 n 的总和不超过 1000。
输出格式
For each test case, output a single integer — the maximum number of subsegments among all possible ways to divide the array a.
对于每个测试用例,输出一个整数——在所有可能的数组 a 划分方式中,子区间的最大数量。
输入输出样例
输入#1
8 3 -1 5 4 2 2023 2043 6 1 4 7 -1 5 -4 5 -4 0 3 -18 10 1 998244853 10 -4 2 5 -10 4 8 2 9 -15 7 7 -7 3 8 -9 -2 2 4 4 -5 5 -2 -5
输出#1
2 1 3 2 1 6 5 3
说明/提示
In the first test case, Daniel can divide the array into [−1] and [5,4], and s=[−1,9]. It can be shown that for any i=j, the condition in the statement is already satisfied, and for i=1,j=2, we have min(−1,9)≤(−1)+9≤max(−1,9).
In the second test case, if Daniel divides the array into [2023] and [2043], then for i=1,j=2 we have 2023+2043>max(2023,2043), so the maximum number of subsegments is 1.
In the third test case, the optimal way to divide the array is [1,4,7],[−1],[5,−4].
In the fourth test case, the optimal to divide the array way is [−4,0,3,−18],[10].
In the fifth test case, Daniel can only get one subsegment.
在第一个测试用例中,Daniel 可以将数组划分为 [−1] 和 [5,4],此时 s=[−1,9]。可以验证:对任意 i=j,题目中的条件已自然满足;而对 i=1,j=2,有 min(−1,9)≤(−1)+9≤max(−1,9)。
在第二个测试用例中,若 Daniel 将数组划分为 [2023] 和 [2043],则对 i=1,j=2,有 2023+2043>max(2023,2043),因此子段的最大数目为 1。
在第三个测试用例中,划分数组的最优方式是 [1,4,7],[−1],[5,−4]。
在第四个测试用例中,划分数组的最优方式是 [−4,0,3,−18],[10]。
在第五个测试用例中,Daniel 只能得到一个子段。
输入解题思路,AI测评打分。不知道怎么写?