HDU 3756 Dome of Circus (三分)
2016-08-05 21:49
375 查看
传送门
题意很简单,就是给你N个三维坐标,要你求一个三菱锥把所有点罩进去,在边边也行,要你求出满足条件的最小体积的三菱锥的高H和底面半径R
很简单三分就行了
但是这题我自己当时过得很惨烈,我写搓了,结果靠交来测答案。
先是我写搓的代码,给巨巨们引以为戒
然而,之后我看了别人代码后才知道,我是多么幸运
加油~
题意很简单,就是给你N个三维坐标,要你求一个三菱锥把所有点罩进去,在边边也行,要你求出满足条件的最小体积的三菱锥的高H和底面半径R
很简单三分就行了
但是这题我自己当时过得很惨烈,我写搓了,结果靠交来测答案。
先是我写搓的代码,给巨巨们引以为戒
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define LL __int64 using namespace std; const double PI = acos(-1.0); const int size = 50; struct point { double x,y,z; }; point insect[110000]; int n; double checkr(double h,double r) { for(int i=0;i<n;i++){ if(insect[i].z > h) return false; double R = (h-insect[i].z)*r/h; if((insect[i].x*insect[i].x + insect[i].y*insect[i].y) > R*R) return false; } return true; } double calc(double h,double r) { return h*r*r*PI/3.0; } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%lf%lf%lf",&insect[i].x,&insect[i].y,&insect[i].z); } double l = 0 , r = 3000,ll,rr; double ans1,ans2,ans3,ans4; double mid,midmid,mid2,midmid2; int size1 = size,size2; while(size1--){//这里我先三分高,再二分最合适的R mid = (r+l)/2; midmid = (mid+r)/2; ll = 0 , rr = 3000; size2 = size; while(size2--){ mid2 = (ll+rr)/2; if(checkr(mid,mid2)) { ans3 = mid2; rr = mid2; }else ll = mid2; } ll = 0 , rr = 3000;//这里我通过作死交猜测对的 size2 = size;//多一些会超时,少一些会WA while(size2--){ mid2 = (ll+rr)/2; if(checkr(midmid,mid2)) { ans4 = mid2; rr = mid2; }else ll = mid2; } if(calc(mid,ans3) > calc(midmid,ans4)){ l = mid; ans1 = midmid; ans2 = ans4; }else{ r = midmid; } } printf("%.3f %.3f\n",ans1,ans2); } return 0; }
然而,之后我看了别人代码后才知道,我是多么幸运
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define LL __int64 using namespace std; const double PI = acos(-1.0); const int size = 50; struct point { double x,y,z; }; point insect[110000]; int n; double ans1,ans2; double calc(double h,double r) { return h*r*r*PI/3.0; } double checkr(double h) { ans2 = 0; for(int i=0;i<n;i++){ double x = sqrt(insect[i].x*insect[i].x + insect[i].y*insect[i].y); double R = x*h/(h-insect[i].z); ans2 = max(ans2,R); } return calc(h,ans2); } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d",&n); double l = 0 , r = 3000; for(int i=0;i<n;i++){ scanf("%lf%lf%lf",&insect[i].x,&insect[i].y,&insect[i].z); l = max(l,insect[i].z);//这里初始的左边界就要做处理了,不然会WA } double mid,midmid; while(fabs(r-l)>1e-9){ mid = l + (r-l)/3.0; midmid = r - (r-l)/3.0; if(checkr(mid) > checkr(midmid)){ l = mid; ans1 = midmid; }else r = midmid; } printf("%.3f %.3f\n",ans1,ans2); } return 0; }
加油~
相关文章推荐
- HDU 3756 Dome of Circus 三分
- hdu 3756 || Dome of Circus || 2010 Northeastern European Regional Contest(三分)
- HDU 3756 Dome of Circus 三分
- hdu 3756 Dome of Circus(三分)
- hdu 3756 Dome of Circus 三分
- HDU 3756 Dome of Circus(计算几何 + 三分)
- hdu 3756 Dome of Circus 三分
- HDU 3756 Dome of Circus
- HDU - 3756 - Dome of Circus
- hdoj 3756 Dome of Circus(三分)
- HDU 3756 Dome of Circus
- hdu 3756 Dome of Circus(模拟退火)
- hdu 3756 三分 Dome of Circus
- HDU 3756 Dome of Circus
- 【三分】HDU3756 Dome of Circus
- Dome of Circus(三分)
- HDU 3756,LA 4986——Dome of Circus
- UVa 1473 - Dome of Circus 三分
- 杭电 3756 Dome of Circus 解题报告
- G - Dome of Circus UVALive - 4986 (三分)