Codeforces Round 703 (Div. 2) A. Shifting Stacks

发布时间 2023-10-11 22:23:45作者: zsxuan

给定 \(n\) 个石堆,第 \(i\) 个石堆高为 \(h_i\) 并且代表这堆石块的个数。在一次操作中你可以将第 \(i\) 堆中的一块石块移动(需要存在石块)到 \(i + 1\) 堆。询问是否可以使石堆的高度严格递增。

显然贪心地让第 \(1\) 堆的高度为 \(0\)

然后线性模拟使得第 \(1 \sim n - 1\) 的石堆高度为 \(0,1,\cdots,n-2\) 。模拟不能进行则无法构造。

最后判断第 \(n\) 堆的高度是否 \(\geq n - 1\)

view
#include <bits/stdc++.h>
typedef long long ll;
void solve() {
	int n; std::cin >> n;
	std::vector<ll> a(n+1);
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	for (int i = 1; i < n; i++) {
		if (a[i] >= i - 1) {
			a[i + 1] += a[i] - (i - 1);
			a[i] -= i - 1;
		}
		else {
			std::cout << "NO" << "\n";
			return;
		}
	}
	std::cout << (a[n] >= n - 1 ? "YES" : "NO") << '\n';
}

int main() {
	int _ = 1; std::cin >> _;
	while(_--) { solve(); }
	return 0;
}