题目链接:hdu 4355 Party All the Time
题意:
有n个人,在一个一维的坐标轴上,现在让他们聚在一起。
每个人移动一段距离会产生一个 不开心值=S3*W,现在问你最小的全部加起来的不开心值是多少。
题解:
目标函数是一个凸函数,直接上三分就行了。
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 typedef pair<double,double>P; 5 const int N=1e5+7; 6 int t,n,cas; 7 P a[N]; 8 9 double check(double mid) 10 { 11 double ans=0; 12 F(i,1,n) 13 { 14 double tmp=abs(a[i].first-mid); 15 ans+=tmp*tmp*tmp*a[i].second; 16 } 17 return ans; 18 } 19 20 int main() 21 { 22 scanf("%d",&t); 23 while(t--) 24 { 25 scanf("%d",&n); 26 F(i,1,n)scanf("%lf%lf",&a[i].first,&a[i].second); 27 double l=0,r=1e6; 28 F(i,1,100) 29 { 30 double mid=(l+r)/2,mmid=(mid+r)/2; 31 if(check(mid)>check(mmid))l=mid;else r=mmid; 32 } 33 printf("Case #%d: %.0f ",++cas,check(l)); 34 } 35 return 0; 36 }