模板三分——cf1355E
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板三分——cf1355E相关的知识,希望对你有一定的参考价值。
发现自己以前的三分模板有问题。。换个标准的!
//整数三分 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<<‘ ‘; }
以上是关于模板三分——cf1355E的主要内容,如果未能解决你的问题,请参考以下文章
cf578c Weakness and Poorness 三分