问题描述
小R拿到了一个数组,她可以进行如下操作:使得一个元素加1,另一个元素减1。她希望最终数组的每个元素大小都在 [l, r]
的范围内。小R想知道,最少需要多少次操作可以达到目标。
如果无法通过有限次操作使所有元素都落在指定范围内,则返回 -1
。
测试样例
样例1:
输入:
n = 2 ,l = 3 ,r = 5 ,a = [1, 2]
输出:-1
样例2:
输入:
n = 3 ,l = 4 ,r = 6 ,a = [3, 6, 5]
输出:1
样例3:
输入:
n = 4 ,l = 2 ,r = 8 ,a = [1, 10, 2, 6]
输出:2
题解:
首先,整个数组的总和是不变的,所以数组的总和的下限和上限时相同的,于是第一步就是考虑这个数组是否可以塞进这个区间里。
不用考虑怎么变,只考虑是否能变。所以将所有低于l的元素和高于r的元素之间的差值取出,叫做lowsize和upsize,而其中的较大值就是最后的操作次数。因为其中高的可以补充低的,低的可以削减高的。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include <functional>
using namespace std;
typedef long long int ll;
int solution(int n, int l, int r, std::vector<int> a) {
// write code here
int low=l*n,up=r*n,i,j,upsize=0,lowsize=0,sum=0;
for(i=0;i<a.size();i++){
sum+=a[i];
}
if(sum<low || sum>up){
return -1;
}
for(i=0;i<a.size();i++){
if(a[i]<l){
lowsize+=l-a[i];
}
if(a[i]>r){
upsize+=a[i]-r;
}
}
return max(lowsize,upsize);
}
int main() {
std::cout << (solution(2, 3, 5, {1, 2}) == -1) << std::endl;
std::cout << (solution(3, 4, 6, {3, 6, 5}) == 1) << std::endl;
std::cout << (solution(4, 2, 8, {1, 10, 2, 6}) == 2) << std::endl;
}
标签:int,upsize,元素,样例,问题,修改,数组,include
From: https://blog.csdn.net/2301_78848414/article/details/143842834