CF1692E
题目大意
给出
如果不能达到 -1 。
基本思路
无解的情况很好判,若不删数都没法到
然后我们想有解的情况该如何删数。
我们发现我们删完数后剩下的一定是一段连续的区间
那么我们处理出前缀和
但是这道题不允许暴力枚举
很显然,
于是我们枚举起点
代码
#include <bits/stdc++.h>
using namespace std;
int s[200005];
main() {
int t; cin >> t; while (t--) {
int n, k; cin >> n >> k;
for (int i = 1; i <= n; ++i) {int x; cin >> x; s[i] = s[i - 1] + x;}
if (k > s[n]) {cout << -1 << endl; continue;}
int p = -0x3f3f3f3f, L, R;
for (int i = 1; i <= n; ++i) {
int l = i, r = n, ans = 0;
while (l < r) {
int mid = l + r + 1 >> 1;
if (s[mid] - s[i - 1] <= k) l = mid;
else r = mid - 1;
}
if (!l) continue;
ans = l - i + 1;
p = max(p, ans);
}
cout << (p == -0x3f3f3f3f ? -1 : (n - p)) << endl;
}
}