POJ3122 Pie(二分)
Posted aaronchang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",l*l*p); 45 } 46 return 0; 47 }
以上是关于POJ3122 Pie(二分)的主要内容,如果未能解决你的问题,请参考以下文章