https://www.bnuoj.com/v3/contest_show.php?cid=9154#problem/F
【题意】
- 给定n个已知半径的披萨,有m个人要分这n个披萨
- 要求每个人分到的面积同样大
- 每个人只能取“一块”披萨上的一部分(或整块披萨),不能从A披萨取一点,再从B披萨取一点
【思路】
- num[v]是非严格单调递减函数,所以可以二分查找答案。v是每人的披萨大小,num是可以满足多少人
- 这道题eps必须是1e-6或1e-7,1e-8会T,1e-5会WA
【Accepted】
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 using namespace std; 9 const double pi=acos(-1.0); 10 const double eps=1e-8; 11 int n,f; 12 const int maxn=1e4+3; 13 double a[maxn]; 14 bool check(double v) 15 { 16 int cnt=0; 17 for(int i=0;i<n;i++) 18 { 19 double size=pi*a[i]*a[i]; 20 cnt+=(int)(size/v); 21 } 22 if(cnt>=f+1) 23 { 24 return true; 25 } 26 else 27 { 28 return false; 29 } 30 } 31 int main() 32 { 33 int T; 34 scanf("%d",&T); 35 while(T--) 36 { 37 scanf("%d%d",&n,&f); 38 for(int i=0;i<n;i++) 39 { 40 scanf("%lf",&a[i]); 41 } 42 sort(a,a+n); 43 double l=0.0; 44 double r=pi*a[n-1]*a[n-1]; 45 while(r-l>=eps) 46 { 47 double mid=(l+r)/2.0; 48 if(check(mid)) 49 { 50 l=mid+eps; 51 } 52 else 53 { 54 r=mid-eps; 55 } 56 } 57 printf("%.4f ",l); 58 } 59 return 0; 60 }