因为这是一个凹函数,所以要三分做,第一次就栽在这上面了。。
参考学习的博客
https://blog.csdn.net/consciousman/article/details/53045734
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
double ans;
double x[50005];
double w[50005];
int n;
double cal(double D)
{
double d=0;
for(int i=0;i<n;i++) {
double dd=fabs(D-x[i]);
d+=dd*dd*dd*w[i];
}
ans=min(ans,d);
return d;
}
int main()
{
int t;
scanf("%d",&t);
int Case=0;
while(t--) {
Case++;
scanf("%d",&n);
double l=1e9,r=-1;
for(int i=0;i<n;i++) {
scanf("%lf%lf",&x[i],&w[i]);
l=min(l,x[i]); r=max(r,x[i]);
}
ans=1e18;
for(int i=0;i<100;i++) {
double m=(2*l+r)/3,mm=(2*r+l)/3;
if(cal(m)>=cal(mm)) l=m;
else r=mm;
}
printf("Case #%d: %.0f\n",Case,ans);
}
}