HDU 4355 Party All the Time(三分)

有个人在一个坐标轴上,同时有 n 件物品,物品有相应的质量和价值,这个人的不开心值为 (pos-x[i]^3)*w[i] ,pos 为上一次人的位置,求一个初始位置 pos ,使得这个人的不开心值最小

题目要求求 pos 的值,需要我们枚举答案,可以证明 ,函数 y=abs(pos-x[i])^3*w[i] 是一个关于 pos 的凹函数,而多个凹函数相加依旧是凹函数

  • y'=3*|pos-x[i]|^2*w[i];
  • y''=6*|pos-x[i]|*w[i];
  • 可以发现二阶导数恒大于 0,即斜率一直增大,所以 y 是一个凹函数,故用三分求解即可​​​​​​​
const int N=5e4+5;

    int i,j,k;
    int n,m,t;
    double a[N],x[N];

double calc(double pos)
{
    double ans=0;
    for(int i=1;i<=n;i++) ans+=a[i]*pow(fabs(pos-x[i]),3);
    return ans;
}

int main()
{
    //IOS;
    int num=0;
    rush(){
        sd(n);
        double l=1e9,r=0;
        for(int i=1;i<=n;i++){
            sff(x[i],a[i]);
        }
        l=x[1],r=x[n];
        double midl,midr;
        while(r-l>eps){
            midl=(l+r)/2;
            midr=(r+midl)/2;
            if(calc(midl)>calc(midr)){
                l=midl;
            }
            else r=midr;
        }
        printf("Case #%d: %d\n",++num,int(calc(l)+0.5) );
    }
    //PAUSE;
    return 0;
}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页