只能说感觉是三分吧,因为两端值肯定是最大的,而中间肯定存在一点使之最小,呃,,,,猜 的。。。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define LL __int64 using namespace std; const int N=50050; double point[N]; double weight[N]; int n; double cal(double x){ double ans=0,t; for(int i=1;i<=n;i++){ t=fabs(x-point[i]); ans+=(t*t*t*weight[i]); } return ans; } int main(){ int T,t=0; scanf("%d",&T); while(++t<=T){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf",&point[i],&weight[i]); double l=point[1],r=point[n],m,mm; while(l+(1e-8)<=r){ m=l+(r-l)/3; mm=r-(r-l)/3; if(cal(m)>cal(mm)) l=m; else r=mm; } double ans=cal(l); printf("Case #%d: %.0lf ",t,ans); } return 0; }