1. 程式人生 > >POJ 3122 Pie【二分答案】

POJ 3122 Pie【二分答案】

std strong ace else pac 蛋糕 pan const +=

<題目鏈接>

題目大意:

將n個半徑不一但是高度為1的蛋糕分給 F+1個人,每個人分得蛋糕的體積應當相同,並且需要註意的是,每個人分得的整塊蛋糕都只能從一個蛋糕上切下來,而不是從幾個蛋糕上東拼西湊而成。現在問每人分得蛋糕的體積是多少。

解題分析:
就是普通的二分答案,但是要註意一下浮點型二分的結構,與整型二分略有不同。

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double PI=acos(-1.0);
int n,m,arr[10010
]; const double eps=1e-6; bool juge(double x){ int sum=0; for(int i=1;i<=n;i++){ sum+=(int)(arr[i]/x); //當每個人得到x體積蛋糕時,最多能夠分給幾個人 } return sum>=(m+1); } int main(){ int T;scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); int maxv=-0x3f;
for(int i=1;i<=n;i++){ scanf("%d",&arr[i]); arr[i]*=arr[i]; //先只進行半徑的平方,不乘上pi,防止損失精度 maxv=max(maxv,arr[i]); } double l=0,r=maxv*1.0; while(r-l>eps){ double mid=(l+r)/2; if(juge(mid))l=mid; else
r=mid; } printf("%.4lf\n",l*PI); } return 0; }

2018-09-20

POJ 3122 Pie【二分答案】