题目描述
编程实现:现有 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;
}