单峰函数(凹型函数) 不断靠近最低值 / 极值点
使最终高度平齐 数组元素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;
}