POJ3122 Pie(二分)

时间:2020-01-09
本文章向大家介绍POJ3122 Pie(二分),主要包括POJ3122 Pie(二分)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目链接:http://poj.org/problem?id=3122

题意:一堆人分蛋糕,每人蛋糕大小一样,求最大能分多少,蛋糕必须是整块整块的,不能两块拼一起。然后注意输入F个人最后要分F+1份。

思路:很简单很水,但是精度处理很恶心,wa了很多发,直接二分蛋糕的半径就行了

AC代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<queue>
 8 #include<map>
 9 #define p 3.14159265359
10 using namespace std;
11 const int maxn = 1e4+5;
12 const double eps = 1e-8;
13 double pie[maxn];
14 int N,F;
15 bool check(double x){
16     int cnt = 0;
17     for(int i = 0;i<N;i++){
18         cnt+=(int)(pie[i]*pie[i]/(x*x));//每次check一下是否满足大于F个 
19     }
20     return cnt>=F;
21 }
22 int main(){
23     int t;
24     scanf("%d",&t);
25     while(t--){
26         scanf("%d%d",&N,&F);
27         F+=1;
28         double MAX = 0.0;
29         for(int i = 0;i<N;i++){
30             scanf("%lf",&pie[i]);
31             MAX = max(MAX,pie[i]);//求出最大半径 
32         }
33         double l = 0, r = MAX*2;//左右区间 
34         double mid;
35         while(l+eps<r){
36             mid = (l+r)/2;
37             if(check(mid)){
38                 l = mid;
39             }
40             else{
41                 r = mid;
42             }
43         }
44         printf("%.4lf\n",l*l*p);
45     }
46     return 0;
47 }

原文地址:https://www.cnblogs.com/AaronChang/p/12171854.html