E. Restorer Distance 三分搜索

单峰函数(凹型函数) 不断靠近最低值 / 极值点
使最终高度平齐 数组元素arr[]==ans
使用三分搜索寻找ans值

同时根据(a,r,m)的关系贪心计算 使数组元素平齐为ans的最小花费

题意:给你一个长度为n的数组,你可以向一个元素加1,代价为A,也可以向一个元素减1,代价为R,还可以把一个元素的1移动到另外一个元素上,代价为M,现在要求你做一些操作,使得所有元素高度相等。

#include<iostream>
using namespace std;
#define int long long
const int maxn=1e5+10;
int n,a,r,m,h[maxn];
int check(int mid)
{
    
    
    int res=0,sum1=0,sum2=0;
    if(a+r<=m)
    {
    
    
        for(int i=1;i<=n;i++)
        {
    
    
            if(h[i]<mid)
                res+=(mid-h[i])*a;
            else
                res+=(h[i]-mid)*r;
        }
    }
    else
    {
    
    
        for(int i=1;i<=n;i++)
        {
    
    
            if(h[i]<mid)
                sum1+=(mid-h[i]);
            if(h[i]>mid)
                sum2+=(h[i]-mid);
        }
        int t=min(sum1,sum2);
        res+=t*m;
        sum1-=t;sum2-=t;
        res+=sum1*a+sum2*r;
    }
    return res;
}
signed main()
{
    
    
    cin>>n>>a>>r>>m;
    for(int i=1;i<=n;i++)
        cin>>h[i];
    int l=0,r=1e9;
    while(l<r)
    {
    
    
        int mid1=l+(r-l)/3,mid2=r-(r-l)/3;
        if(check(mid1)>check(mid2))
            l=mid1+1;
        else
            r=mid2-1;
    }
    int res=2e18;
    for(int i=l;i<=r;i++)
        res=min(res,check(i));
    cout<<res<<endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_56336619/article/details/115033347