这道题是一道二分搜索的题,首先计算出最大的平均体积:mx=V总/f;然后去left=0,right=mx,mid=(left+right)/2进行二分搜索,当所有pi分割出的mid的个数是大于等于f时,说明这个mid是满足条件的,一直搜索知道找到最大的mid;这题的核心还是精度的问题。不得不说这题对精度的要求实在是太高了。首先是mi的精度,当我用的是mi=1e-8时,会超时,慢慢将mi降到1e-6。后来又发现当将pi定义为3.1415926535是个会wa掉,后来参考了一下别人的代码才知道原来double pi = acos(-1.0) 这样定义pi精度会更高。。。也是醉了。
#include"iostream" #include"stdio.h" #include"algorithm" #include"string.h" #include"cmath" #define mi 1e-6 //#define pi 3.1415926535 using namespace std; double pi = acos(-1.0); double v[10005]; int f,n; bool test(double x) { int i,num=0; for(i=0;i<n;i++) { num+=(int) (v[i]/x); } if(num>=f) return true; else return false; } int main() { int t; cin>>t; while(t--) { int i,j; cin>>n>>f; f++; double r,left,right,mid,mx,V=0; for(i=0;i<n;i++) {cin>>r;v[i]=pi*r*r;V+=v[i];} mx=V/f; left=0;right=mx; while(right-left>mi) { mid=(right+left)/2.0; if(test(mid)) left=mid; else right=mid; } printf("%.4lf ",mid); } return 0; }