hdu 4355 Party All the Time三分
hdu 4355 Party All the Time
题目:hdu4335
恩,多校第六场的题,看了题解说三分最简单赶紧来看看。。果然就这样过了。
不过之前做过一道三分的题目,有位大神二分也可以过,也没看懂他怎么写的。。不知道这个可不可以二分水过了。
至于为什么是三分,我是感觉题目给出的函数结合题意得出的图像应该是具有凸性或凹性的,所以这里用三分比较合适吧。
不过郁闷的是C++就超时,G++就AC。。唉,不管了。
标程的三分那里直接写成
int time=60; while(time--) { ··· }
感觉是水过了- -
当然除了三分,题解里还说可以枚举两个端点,极值求导什么的。
三分的代码:
2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #define eps 1e-6 6 using namespace std; 7 int n; 8 double x[50010],w[50010]; 9 10 double fuc(double a) 11 { 12 double d,ans=0; 13 for(int i=1;i<=n;i++) 14 { 15 d=fabs(x[i]-a); 16 ans+=d*d*d*w[i]; 17 } 18 return ans; 19 } 20 21 int main() 22 { 23 int t,tt=1; 24 scanf("%d",&t); 25 while(t--) 26 { 27 scanf("%d",&n); 28 for(int i=1;i<=n;i++) 29 scanf("%lf%lf",x+i,w+i); 30 double m1,m2; //三分 31 double l =-1e6+0.0,r =1e6+0.0; 32 while(r-l>eps) 33 { 34 m1=(l+r)/2; 35 m2=(m1+r)/2; 36 if(fuc(m1)<fuc(m2))r=m2; 37 else l=m1; 38 } 39 if(n==1) printf("Case #%d: %.0f\n",tt++,0.0); 40 else 41 printf("Case #%d: %.0f\n",tt++,fuc(m1)); 42 } 43 return 0; 44 }
http://acm.hdu.edu.cn/showproblem.php?pid=4355