样例输入:
2
10 20
10 15
样例输出:
5
思想
先判断总和符不符合条件,再去调整左右两边。
样例解析:
a[i]: 10 20
l,r:10 15
因为n=2,所以此时的界限是[20,30]。数组a的值的总和为:10+20=30。我们发现这个总和值是没有超出界限的,因此一定有一个合法解。
a[1]=10,离l边界还差5,a[2]是20,超出r边界5。因为题目要求求最小的操作次数,因此我们只需要取其中差值最大的一个即可(这样可以最少操作)。
code
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=1e5+10;
int a[N];
int sum;
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>a[i],sum+=a[i];
int l,r,ls=0,rs=0;cin>>l>>r;
for(int i=0;i<n;i++)
{
if(a[i]<l)ls+=l-a[i];
if(a[i]>r)rs+=a[i]-r;
}
if(sum>r*n||sum<l*n)
{
cout<<"-1";
return 0;
}
else
{
if(ls>rs)cout<<ls;
else cout<<rs;
}
return 0;
}