uvaLive3635

来源:互联网 发布:禅道数据库默认密码 编辑:程序博客网 时间:2024/05/17 02:03

题目大意:
分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;}
0 0
原创粉丝点击