标签:二分答案
题意:共有n颗炸弹,每颗炸弹的爆炸倒计时ai,你能够在每回合执行如下操作:选择任意一颗炸弹,让它的倒计时+1。该操作之后所有的炸弹倒计时都会-1,如果有炸弹爆炸那就游戏结束,否则的话继续执行上述操作。问你最多能够执行多少次操作。
思路:对操作次数二分答案,考虑到操作上线,二分范围为:1——1e14,因为你每操作一次所有的炸弹倒计时都会减一,所以你操作的次数就是该颗炸弹没有经过你的操作时会进行的倒计时次数,用每个炸弹的倒计时和你的操作次数比较,如果小于操作次数,就说明多的那部分是这颗炸弹被你所操作的次数,我们需要统计所有这样的次数,求和,和当前的操作次数比较,如果大于当前的操作次数,说明操作次数多了,就往左半边二分查找,循环如此。
代码:
# include<iostream>
# include<algorithm>
# define ll long long
using namespace std;
const int maxn = 1e5 + 5;
int n;
int arr[maxn];
bool check(ll ans){
ll sum = 0;
for(int i = 1; i <= n; i++)
if(arr[i] - ans < 0)
sum += ans - arr[i];
if(sum > ans)
return true;
return false;
}
int main(){
int t;
int c = 0;
cin >> t;
while(t--){
cin >> n;
for(int i = 1; i <= n; i++)
cin >> arr[i];
sort(arr + 1, arr + n + 1);
ll ans = (ll)1e14;
ll l = 0, r = ans;
while(l < r){
ll mid = (l + r) >> 1;
if(check(mid))
r = mid;
else
l = mid + 1;
}
cout << "Case #" << ++c << ": ";
cout << l << endl;
}
return 0;
}