游游的元素修改-携程24秋招研发岗第一批
游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。
游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?
- 根据数据范围,确定使用long long 数据类型,防止越界。
- 贪心思想:最少操作次数==》+1-1不回退,则操作次数最少。
- 统计区间左边、区间右边分别移动到区间范围的最小步数。
- 统计区间左边、区间右边分别移动到区间范围的最大步数,包括本来在区间范围中的,也需要计算移动步数。
#include<iostream>
#include<vector>
#include<string>
#include<cmath>
#include<deque>
#include<queue> //priority_queue也在这里面
using namespace std;
int main(){
long long t;
cin>>t;
while(t--){
long long n,l,r;
cin>>n>>l>>r;
vector<long long> nums(n);
for(long long i=0;i<n;++i){
cin>>nums.at(i);
}
long long left=0;
long long leftMax=0;
long long right=0;
long long rightMax=0;
for(long long i=0;i<n;++i){
if(nums.at(i)<l){
left+=l-nums.at(i);
leftMax+=r-nums.at(i);
}
if(nums.at(i)>=l && nums.at(i)<=r){
leftMax+=r-nums.at(i);
rightMax+=nums.at(i)-l;
}
if(nums.at(i)>r){
right+=nums.at(i)-r;
rightMax+=nums.at(i)-l;
}
}
if(left>=right && left<=rightMax){
cout<<left<<endl;
}else if(right>=left && right<=leftMax){
cout<<right<<endl;
}else{
cout<<"-1"<<endl;
}
}
return 0;
}