[CCPC2020绵阳D] Defuse the Bombs - 二分
Description
有n个炸弹,每个炸弹都有一个初始的时间,然后每次你可以选择其中的一个炸弹,让它的爆炸时间加1;同时所有炸弹的爆炸时间都会减1;如果其中有一个炸弹的爆炸时间小于0的话就结束了。需要求最久什么时候结束。
Solution
二分一个时间,然后 (O(n)) 检验即可
注意不能把边界设太大,否则检验过程中会溢出
#include <bits/stdc++.h>
using namespace std;
#define int long long
int caseid = 0;
void solve()
{
++caseid;
int n;
cin >> n;
vector<int> a(n + 2);
for (int i = 1; i <= n; i++)
cin >> a[i];
int l = 0, r = 1e12;
while (l < r)
{
int mid = (l + r) / 2;
int sum = 0;
for (int i = 1; i <= n; i++)
sum += max(0ll, mid - a[i]);
if (sum <= mid)
l = mid + 1;
else
r = mid;
}
cout << "Case #" << caseid << ": " << l << endl;
}
signed main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
solve();
}