Defuse the Bombs Gym - 102822D
题目:
给你n个数,现在每轮会有三个操作:
1.选择一个数,使他加一
2.所有数减一
3.当有一个数变成负数时结束操作,否则回到第一步
问最多能进行几次第一步?
题解:
题目相当于在问最多能进行几轮,
这个题不大好想,我们可以转换下思路,题目说的是先选一个数加1,然后其他数减一,然后问最多能加几轮,那我们可不可以这么想,我们先将所有数减,最后再加,看是否所有数都大于等于0。我们设最多加了x轮,那么所有数都要减x,然后我们看所有比0小的数,他们与0的差的绝对值的和是多少,因为我们要用x去补,如果x大于等于和,说明当前x轮可以完成,这个x可以用二分去寻找
是否符合单调性呢?题目是符合的,
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const int maxn=2e5+9;
ll a[maxn];
int n;
bool check(ll x){
ll sum=0;
for(int i=1;i<=n;i++){
if(a[i]<x)sum+=(x-a[i]);
}
if(sum<=x)return 1;
return 0;
}
int main(){
int t;
cin>>t;
int cas=0;
while(t--){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
ll l=1,r=2e10;
while(l<r){
ll mid=l+r>>1;
if(check(mid))l=mid+1;
else r=mid;
}
printf("Case #%d: %d\n",++cas,r);
}
return 0;
}