题目大意:
分pie给小朋友,有N个派,F+1个小朋友,求每个小朋友可以分到的最大的派,派不可以是拼凑起来的。
思路:
由于受到了上一题(组装电脑)的影响,所以这一题看起来感觉类似,也想着用二分做,二分出每个小孩子可以分到的派的大小,然后判断这个大小是否可行。只需将每个派的面积处以这个大小,所有的值加起来看是否大于F+1。
代码:
#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <cmath>
#include <cstdlib>
const double PI = acos(-1.0);
int N,F;
double A[10005];
bool ok(double m) {
int sum = 0;
for(int i = 0 ; i < N; i++) {
sum = sum + floor(A[i]/m);
}
if(sum >= F + 1) return true;
else
return false;
}
int main() {
int T;
double r;
double maxa;
scanf("%d",&T);
while(T--) {
maxa = 0;
scanf("%d %d",&N,&F);
for(int i = 0; i < N; i++) {
scanf("%lf",&r);
A[i] = PI*r*r;
maxa = max(maxa,A[i]);
}
double l = 0, r = maxa,mid;
while(r - l > 1e-5) {
mid = (l + r)/2;
if(ok(mid)) l = mid;
else r = mid; // 两个地方都应该是mid
}
printf("%.5lf\n",r);
}
return 0;
}