码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】三分——cf1355E

时间:2020-05-19 14:30:52      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:自己   mes   color   高度   cin   include   ace   return   rmi   

发现自己以前的三分模板有问题。。换个标准的!

//整数三分
int l = 1,r = 100;
while(l < r) {
    int lmid = l + (r - l) / 3;
    int rmid = r - (r - l) / 3;
    lans = f(lmid),rans = f(rmid);
    // 求凹函数的极小值
    if(lans <= rans) r = rmid - 1;
    else l = lmid + 1;
    // 求凸函数的极大值
    if(lasn >= rans) l = lmid + 1;
    else r = rmid - 1;
}
// 求凹函数的极小值
cout << min(lans,rans) << endl;
// 求凸函数的极大值
cout << max(lans,rans) << endl;
//浮点三分
const double EPS = 1e-9;
while(r - l < EPS) {
    double lmid = l + (r - l) / 3;
    double rmid = r - (r - l) / 3;
    lans = f(lmid),rans = f(rmid);
    // 求凹函数的极小值
    if(lans <= rans) r = rmid;
    else l = lmid;
    // 求凸函数的极大值
    if(lans >= rans) l = lmid;
    else r = rmid;
}
// 输出 l 或 r 都可
cout << l << endl;

本题代码

#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define ll long long

ll n,a,r,m,h[N];

ll f(ll x){//所有高度变成x
    ll c1=0,c2=0; 
    for(int i=1;i<=n;i++) 
        if(h[i]<=x)c1+=x-h[i];
        else c2+=h[i]-x;
    ll res=0;
    if(m<a+r){
        ll t=min(c1,c2);
        res+=m*t;
        c1-=t;c2-=t;
    }
    res+=a*c1+r*c2;
    return res;
}

int main(){
    cin>>n>>a>>r>>m;
    for(int i=1;i<=n;i++)cin>>h[i];
    sort(h+1,h+1+n);
    ll L=0,R=h[n],midl,midr,ans=0;
    while(L<R){
        midl=L+(R-L)/3;
        midr=R-(R-L)/3;
        ll res1=f(midl),res2=f(midr);
        if(res1<=res2){
            ans=res1;R=midr-1;
        }else {
            ans=res2;L=midl+1;
        }
    }
    cout<<ans<<\n;
}

 

【模板】三分——cf1355E

标签:自己   mes   color   高度   cin   include   ace   return   rmi   

原文地址:https://www.cnblogs.com/zsben991126/p/12916489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!