//整數三分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;
//浮點三分constdouble 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;
ac代碼:
#include<bits/stdc++.h>
using namespace std;typedeflonglong ll;constint maxn =1e5+10;int N, A, R, M;int H[maxn];
ll count(int h){
ll sub =0, add =0, res =0;for(int i =1; i <= N; i++)if(H[i]<h) add+=h-H[i];else sub+=h-H[i];if(M<A+R){
ll mi =min(abs(sub), add), dif = sub+add;
res+=mi*M;if(abs(sub)<add) res+=abs(dif)*A;else res+=abs(dif)*R;}else res =abs(sub)*R+add*A;return res;}intmain(){//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%d%d%d%d",&N,&A,&R,&M);int l =0, r =0;for(int i =1; i <= N; i++)scanf("%d",&H[i]), r =max(H[i], r);while(l<r){int midl = l+(r-l)/3;int midr = r-(r-l)/3;if(count(midl)>=count(midr)) l = midl+1;else r = midr-1;}printf("%lld\n",count(l));return0;}