传送门:
https://codeforces.com/contest/1700/problem/D
题意:
有n个水槽,每个水槽开启时能每秒流下一单位的水,满了就流向第i+1个水槽。最后一个水槽流向大海。q次询问,对每个t,求要使t秒内装满所有水槽最少要打开多少开关。
解法:
开启靠后的水槽最后流到河里的浪费的多,所以只开启前缀的水槽。
并处理出流到每个i装满所需的最小的t。
#include<bits/stdc++.h>
const int N = 2e5 + 10;
#define int long long
int v[N];
long long dp[N],s[N],maxs[N];
signed main() {
int n; std::cin >> n;
for (int i = 1; i <= n; i++) {
std::cin >> v[i];
s[i] += s[i - 1] + v[i];
if (i == 1) {
maxs[1] = v[i];
}
else {
maxs[i] = std::max(maxs[i - 1], s[i] / i + (bool)(s[i] % i));
}
}
dp[1] = s[n];
for (int i = 2; i <= n; i++) {
dp[i] = std::max(maxs[i - 1], s[n] / i+ (bool)(s[n] % i));
}
for (int i = 1; i <= n; i++)dp[i] = -dp[i];
int q; std::cin >> q;
while (q--) {
int t; std::cin >> t;
if (t < maxs[n]) {
std::cout << -1 << "\n";
continue;
}
int p = std::lower_bound(dp + 1, dp + 1 + n, -t) - dp;
std::cout << p << "\n";
}
}
浙公网安备 33010602011771号