码蹄杯 小码哥的计划表 题型:模拟

77 阅读1分钟

码题集OJ-小码哥的计划表 (matiji.net)

image.png 样例输入:

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;
}

image.png