【二分贪心+精度问题】F. Pie

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 }
View Code
原文地址:https://www.cnblogs.com/itcsl/p/7191607.html