洛谷 CF1084B 题解

注:本文为洛谷用户 zhangsenhao6728(也就是我)的题解,已提交成功。

题意理解

n n n 小杯饮料,要用这些饮料装满容量为 s s s 升的大杯(小 FN 能喝下去吗),问是否能装满,若可以,要求装满后小杯饮料中的饮料量最小的那一杯的饮料量尽量大(有点拗口)。

思路讲解

首先求出 n n n 杯饮料的总升数,若小杯的总升数还不到大杯的升数,那一定装不满,直接输出 − 1 -1 1

若能装满,进行如下操作,设第 i i i 个小杯的饮料量为 a i a_i ai

  • 找到小杯最小饮料量,设最小饮料量的小杯编号为 m i n min min
  • 遍历每个杯子,使每个小杯倒出 a i − a m i n a_i-a_{min} aiamin,也就是使每个小杯的饮料量变成 a m i n a_{min} amin(不用管大杯有没有倒满,反正最小饮料量不会变)。
  • 遍历完后有两种情况,第一种是大杯已经倒满了,这时小杯的最小饮料量为 a m i n a_{min} amin,直接输出 − 1 -1 1;大杯若没有倒满,就是第二种情况,继续进行下面的操作。
  • 你需要进行多次操作,每次操作就是使每个小杯倒出 1 1 1 升到大杯里,若当前操作后大杯装满了,那么最小饮料量就是 a m i n − d a_{min}-d amind,这里设 d d d 为操作次数,注意:如果 a m i n − d < 0 a_{min}-d<0 amind<0,那么也要输出 − 1 -1 1。当然你可以用一道算式来表示操作次数,设大杯还未装的升数为 L L L d = ⌈ L n ⌉ d=\lceil\frac{L}{n}\rceil d=nL,因为每次操作都是 n n n 个小杯倒 1 1 1 升,也就是每次操作倒 1 × n = n 1\times n=n 1×n=n 升。

你们最爱的 AC 代码

#include<bits/stdc++.h>
using namespace std;
int a[1001];
int main(){
	long long s;
	int minn=1000000001;
	int n;
	cin>>n>>s;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		minn=min(minn,a[i]);
	}
	for(int i=1;i<=n;i++){
		s-=(a[i]-minn);
	}
	if(s<=0){
		cout<<minn;
		return 0;
	}
	s=ceil(s*1.0/n);
	if(s>minn){
		cout<<-1;
	}else{
		cout<<minn-s;
	}
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值