Codeforces Round 892 (Div. 2) B. Olya and Game with Arrays

发布时间 2023-10-17 20:42:26作者: zsxuan

一系列 \(n\) 个数组,第 \(i\) 个数组的大小 \(m_i \geq 2\) 。第 \(i\) 个数组为 \(a_{m_1}, a_{m_2}, \cdots, a_{m_i}\)

对于每个数组,你可以移动最多一个元素到另一个数组。

一系列 \(n\) 个数组的 \(beauty\) 定义为 \(\sum_{i=1}^{n} min_{j=1}^{m_i} a_{i, j}\) 。询问你经过若干操作后能够使这系列数组得到的最大美丽值,

一: \(min_{j=1}^{m_i} a_{i, j}\) 一定会对 \(beauty\) 产生贡献。假设是第 \(p\) 个数组。

二:除了第 \(p\) 个数组,所有数组都可以对 \(beauty\) 贡献次小值,然后将最小值移到数组 \(p\)\(min\ a_p\) 不会更小。

设第 \(i\) 个数组的最小值为 \(m1_i\) ,次小值为 \(m2_i\)

于是答案为 \(ans = \sum_{i=1}^{n} m2_i - min_{i=1}^{n} m2_i + min_{i=1}^{n} m1_i\)

view
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
	int n; std::cin >> n;
	ll ans = 0;
	int mi_m1 = 1 << 30, mi_m2 = 1 << 30;
	for (int i = 1; i <= n; i++) {
		int m; std::cin >> m;
		int m1 = 1 << 30, m2 = 1 << 30;
		for (int i = 1; i <= m; i++) {
			int x; std::cin >> x;
			if (x <= m1) m2 = m1, m1 = x;
			else if (x <= m2) m2 = x;
		}
		mi_m1 = std::min(mi_m1, m1);
		mi_m2 = std::min(mi_m2, m2);
		ans += m2;
	}
	std::cout << ans - mi_m2 + mi_m1 << "\n";
}
int main() {
	int _ = 1; std::cin >> _;
	while (_--) {solve();}
	return 0;
}