传送门:

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";
	}
}
posted on 2022-07-14 17:12  wtn135687  阅读(58)  评论(0)    收藏  举报