糖果(第十四届 STEMA-C++ T4)

题目描述
编程实现:现有 N 耀糖果,且已知每罐糖果的初始数量。

现给出两个数值 L 和 R(L<R),需要把每糖果的数量调整为: L≤任意罐糖果的数量≤R。

调整的方式是每次从其中一罐糖果中拿出 1 块放到其他糖果罐中。

请你计算出最少调整几次才能使每罐糖果的数量都在 L 到 R 范围之间,如果不能将每罐糖果都调整到 L 到 R 范围之间则输出 -1。
例如: N=2 罐糖果的初始数量为 3 和 8,L=3,R=6。

通过调整使得: 3<任意一罐糖果的数量<6,调整方式如下:第一次从初始数量为 8 的罐中拿 1 块放到初始数量为 3 的罐中,调整后为 (4,7);

第二次从数量为 7 的罐中拿 1 块放到数量为 4 的罐中,调整后为(5,6);故最少调整 2 次。

输入格式
第一行输入一个正整数 N(N<30),表示糖果的罐数。
第二行输入 N 个正整数 (1<正整数<100),表示每罐糖果的初始数量,每个正整数之间以一个空格隔开。

第三行输入两个正整数 L,R(1≤L,R≤100),表示每罐糖果的数量所要调整的范围,两个正整数之间以一个空格隔开。

输出格式
输出一个整数,表示最少调整几次才能使 N 罐糖果数量都在 L 和 R 范围之间,如果不能将 N 罐糖果调整到 L 到 R范围之间则输出 -1。

思路:

考虑先把所有糖果加起来 然后平均分到n罐⾥ 计算出平均值x 。显然如果x<L或者x>R就不可⾏ 否则起码可以调整成均分状态
接着考虑有解的情况 假设所有少于L的罐⼦⾥ 要加到L颗糖果需要的糖果数
之和为suma, 所有超过R的罐⼦⾥ ,超过R的糖果数的和记为sumb。
那么,我们可以将sumb⾥的糖果拿到suma⾥去 ⽤超出的去给少于的。这样可以通过min(suma,sumb)次调整 ,使得所有罐⼦都不少于L或者都不多于R, 那么还剩下suma-sumb颗糖果需要加到某些罐⼦⾥,⼜或者剩下sumb-suma颗糖果需要从罐⼦⾥被拿⾛ 直接按照需求调整这么多次就⾏ ,因 为我们在开头已经判断了 题⽬是⼀定有解的 如果不能直接调整 ,那么就变成⽆解的了。

程序如下:

#include<bits/stdc++.h>
using namespace std;
int n,l,r,sum,suma,sumb,a[30];
int main(){
	cin>>n;
	for(int i=0;i<n;i++)cin>>a[i],sum+=a[i];
	cin>>l>>r;
	for(int i=0;i<n;i++){
		if(a[i]<l)suma+=l-a[i];
		if(a[i]>r)sumb+=a[i]-r;
	}
	if(sum<l*n||sum>r*n){
		cout<<-1;
		return 0;
	}
	cout<<min(suma,sumb)+abs(suma-sumb);
	return 0;
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值