Defuse the Bombs Gym - 102822D

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;
}
上一篇:Codeforces Gym 101173 部分题题解


下一篇:亲测可用的 Linux(Ubuntu18.04下)可运行的超级玛丽奥(gym-super-mario-bros)游戏的仿真环境—————————可用于强化学习算法的游戏模拟器环境