1400*B. Toy Blocks

Example

input

3
3
3 2 2
4
2 2 3 2
3
0 3 0

output

1
0
3

解析:

对于某个盒子,我们用其余盒子的最大值 mx 乘以其余的盒子数量(n-1),再减去其余盒子当前的数量 ( sum-a[ i ] ),即为需要补上的数量 cnt

现在这个盒子中有 p 个

1. 如果 p<=cnt, 说明当前盒子的玩具全部分到别的盒子依然不够,所以要补上 cnt-p 个。

2. 如果 p>cnt ,说明当前盒子的玩具全部分到别的盒子还会多出一部分,这一部分必须平均分出去使得其余盒子都相同,所以先对于 n-1 取模,剩余的数量再补上 (n-1)- p个,即为所求。

全部取最大值即为答案。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll t,n,a[N],f1,f2,sum;
int main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		ll sum=0;
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i]);
			sum+=a[i];		//计算总和 
		}
		ll res=0,mx;
		sort(a+1,a+n+1);	//排序 
		for(int i=1;i<=n;i++){
			if(i==n) mx=a[n-1];		// mx为除了当前 i 之外的最大值 
			else mx=a[n];
			ll cnt=(n-1)*mx-(sum-a[i]);		//计算剩余需要补上的差 
			if(a[i]<=cnt) res=max(res,cnt-a[i]);	//不够,则差即为要补上的值 
			else{
				ll p=a[i]-cnt;	//否则,取模并且计算差值 
				if(p%(n-1)!=0){
					p%=(n-1);
					res=max(res,n-1-p);
				}
			}
		}
		printf("%lld\n",res);
	}
	return 0;
}
相关推荐
Tester_孙大壮10 分钟前
Python爬虫技术科普
开发语言·爬虫·python
帅逼码农11 分钟前
有限域、伽罗瓦域、扩域、素域、代数扩张、分裂域概念解释
算法·有限域·伽罗瓦域
点点滴滴的记录14 分钟前
Java的CompletableFuture实现原理
java·开发语言·javascript
Jayen H16 分钟前
【优选算法】盛最多水的容器
算法
程序猿online17 分钟前
nvm安装使用,控制node版本
开发语言·前端·学习
一只傻小白,20 分钟前
JAVA项目中freemarker静态模板技术
java·开发语言
机跃22 分钟前
递归算法常见问题(Java)
java·开发语言·算法
lijiachang03071831 分钟前
设计模式(一):单例模式
c++·笔记·学习·程序人生·单例模式·设计模式·大学生
<但凡.33 分钟前
题海拾贝:蓝桥杯 2020 省AB 乘法表
c++·算法·蓝桥杯
程序员-小李42 分钟前
餐厅下单助手系统(Java+MySQL)
java·开发语言·mysql