给定一个100*100*100(单位:毫米)的奶酪方块,这个奶酪含有n个球形小孔。现在要求将这个奶酪切成s片使得每片质量相等。
标签:
第一行包含两个整数n,s,表示奶酪有n个小空,要切成s片(0≤n≤10000,1≤s≤100)
从边界z=0依次输出每片的厚度(单位:毫米),输出答案与标准答案的相对误差或绝对误差不超过1e-6。
二分答案,由于球互不相交所以体积很好算,不完整的球体积用定积分可以推出公式,完整的用球的体积公式
#include<cstdio> #include<cmath> typedef long double ld; const ld pi=acos(-1.); int n,s; ld zs[10010],rs[10010],ps[110]; ld V=1000000; ld get(ld x){ ld a=x*10000; for(int i=0;i<n;i++)if(zs[i]+rs[i]<=x){ a-=rs[i]*rs[i]*rs[i]*(4./3.*pi); }else if(zs[i]-rs[i]<x){ ld z=x-zs[i]; a-=2./3.*pi*rs[i]*rs[i]*rs[i]+pi*(rs[i]*rs[i]*z-z*z*z/3.); } return a; } ld cal(ld V){ ld L=0,R=100,M; while(L+1e-10<R){ M=(L+R)*.5; if(get(M)<V)L=M; else R=M; } return L; } ld cals(ld x){ ld a=10000; for(int i=0;i<n;i++)if(zs[i]+rs[i]>=x&&zs[i]-rs[i]<=x){ ld z=x-zs[i]; a-=pi*(rs[i]*rs[i]-z*z); } return a; } int main(){ scanf("%d%d",&n,&s); for(int i=0,x;i<n;i++){ scanf("%d",&x); rs[i]=x*0.001; scanf("%d",&x); scanf("%d",&x); scanf("%d",&x); zs[i]=x*0.001; V-=rs[i]*rs[i]*rs[i]*(4./3.*pi); } ps[0]=0; for(int i=1;i<=s;i++)ps[i]=cal(i*V/s); for(int i=1;i<=s;i++)printf("%.9Lf\n",ps[i]-ps[i-1]); return 0; }
bzoj4109: [Wf2015]Cutting Cheese
标签:
原文地址:http://www.cnblogs.com/ccz181078/p/5638956.html