E - Antinomy与红玉海

题目链接

沉迷《原初幻想41》的冒险者Antinomy来到了红玉海——远东之国和奥萨德次大陆之间的中立海域。

Antinomy走到天之御柱前,发现卑微红色职业们正在排队,无聊的在一起玩游戏,由于自己是高贵的蓝色职业,所以Antinomy无法理解他们在玩什么,但是可以看出,他们一共有nnn个人,每个回合中需要有一个人当工具人来计分,剩下的人进行游戏。

但是他们都不想当工具人,而是想参与游戏,其中第iii个卑微红想至少参加RiR_iRi​个回合的游戏。

Antinomy想知道他们的游戏至少要进行多少个回合才能满足每个卑微红的要求?

注意,并不是每个卑微红都必须得当一次工具人,如果满足要求,每个人也可以一直当工具人。

输入描述:

第一行输入一个整数nnn表示卑微红的数量。

第二行是nnn个空格分隔的整数,分别表示R1,R2,R3,…RnR_1,R_2,R_3,…R_nR1​,R2​,R3​,…Rn​

输出描述:

输出一行一个整数表示答案

思路:

二分,二分回合数,check函数中检测的是每个人可以当工具人的回合数,如果进行了x局游戏,第 i 个人只需要 y 局游戏,那么他可以当x - y局工具人,如果x - y小于0则一定不可行,如果所有的x 都 对于对应的 y,看总和是否大于 x,如果总和大于等于x,说明可以保证每一局都有工具人,否则不满足条件

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll a[1000000];
bool check(ll x) {
	ll sum = 0;
	for (int i = 1; i <= n; i++) {
		if (x < a[i])return false;
		sum += (x - a[i]);
	}
	return sum >= x;
}
int main()
{
	ios::sync_with_stdio(false);
	cin >> n;
	ll sum = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		sum += a[i];
	}
	ll l = 1, r = sum;
	ll res = -1;
	while (l <= r) {
		ll mid = (l + r) >> 1;
		if (check(mid)) {
			r = mid - 1;
			res = mid;
		}
		else l = mid + 1;
	}
	cout << res << "\n";
	return 0;
}
扫描二维码关注公众号,回复: 8806179 查看本文章

还有一个巨巨写的代码,蒟蒻看不懂QWQ

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pi = pair <int, int>;
const int N = 2e5 + 10;
ll a[N];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    ll x = *max_element(a, a + n), s = accumulate(a, a + n, 0ll);
    cout << (x * (n - 1) >= s ? x : (x + 1) * (n - 1) >= s ? x + 1 : x + 2);
}
发布了143 篇原创文章 · 获赞 11 · 访问量 8207

猜你喜欢

转载自blog.csdn.net/weixin_43701790/article/details/103486339
E
e'e
e4e
今日推荐