码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3122 Pie(二分)

时间:2020-01-09 15:56:03      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:注意   queue   bool   c代码   个人   处理   code   scanf   string   

题目链接: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 }

POJ3122 Pie(二分)

标签:注意   queue   bool   c代码   个人   处理   code   scanf   string   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!