游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。 游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?

区块链毕设网qklbishe.com为您提供问题的解答

游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。
游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?

#include <bits/stdc++.h>
using namespace std;
int k,n,l,r;
 vector<int> v;
 void print(vector<int>v){
    for(int i=0;i<n;i++)cout<<v[i]<<‘ ‘;
    cout<<endl;
 }
typedef long long int64 ;
int main() {
    cin>>k;
    while(k–){
        cin>>n>>l>>r;
        v.resize(n);
        for(int i=0;i<n;i++)cin>>v[i];
        sort(v.begin(),v.end());
        // print(v);
        // for(int i=0;i<n;i++)cout<<valid(v[i])<<‘ ‘;
        int res=0;
        int i=0,j=n-1;
        if(v[i]>r||v[j]<l){
            cout<<-1<<endl;
            continue;
        }
        int64 a=0,b=0,c=0,asum=0,bsum=0,csum=0;
        for(int i=0;i<n;i++){
            int e=v[i];
            if(e<l){
                asum+=l-e;
                a++;
            }else  if(e>r){
                csum+=e-r;
               c++;
            }else {
                b++;
                bsum+=e-l;
            }
        }
        // cout<<a<<asum<<endl;
        //  cout<<b<<bsum<<endl;
        //   cout<<c<<csum<<endl;
        if(csum<asum){
            if(asum-csum<=bsum+c*(r-l) ){
                cout<<asum<<endl;
            }
            else cout<<-1<<endl;
        }
        else if(csum>asum){
            if(csum-asum<=(a+b)*(r-l) -bsum){
                cout<<csum<<endl;
            }
            else cout<<-1<<endl;
        }
        else {
            cout<<asum<<endl;
        }
    }
}
// 64 位输出请用 printf("%lld")
26:24

以上就是关于问题游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。
游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?的答案

欢迎关注区块链毕设网-
专业区块链毕业设计成品源码,定制。

区块链NFT链游项目方科学家脚本开发培训

从业7年-专注一级市场


微信:btc9767
TELEGRAM :https://t.me/btcok9

具体资料介绍

web3的一级市场千万收益的逻辑


进群点我



qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台-javagopython毕设 » 游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。 游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?