UVA 12097 Pie(二分答案)

题目链接:

这道题虽然不是一道典型的二分答案题,但同样也可以用二分答案来做。

来二分面积为$area$的派,然后看看条件是否矛盾。

与其矛盾的便是$f+1$个人是否每个人都会有。

一个半径为$r$的派只能切出$floor(pi r^2/x)$块。

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const double PI=acos(-1.0);
 8 const int maxn=10005;
 9 
10 int n,f;
11 double A[maxn];
12 
13 bool ok(double area){
14     int sum=0;
15     for(int i=0;i<n;i++) sum+=floor(A[i]/area);
16     return sum>=f+1;
17 }
18 
19 int main(){
20     int T;
21     scanf("%d",&T);
22     while(T--){
23         scanf("%d%d",&n,&f);
24         double maxa=-1;
25         for(int i=0;i<n;i++){
26             int r; scanf("%d",&r);
27             A[i]=PI*r*r;
28             maxa=max(maxa,A[i]); 
29         }
30         double L=0,R=maxa;
31         while(R-L>0.00001){
32             double M=(L+R)/2;
33             if(ok(M)) L=M; else R=M;
34         }
35         printf("%.4lf
",L);
36     }
37     return 0;
38 }
AC代码
原文地址:https://www.cnblogs.com/New-ljx/p/12301195.html