题目大意:n块馅饼分给m+1个人,每个人的馅饼必须是整块的,不能拼接,求最大的。
解题思路:
1)用总饼的体积除以总人数,得到每个人最大可以得到的V.但是每个人手中不能有两片或多片拼成的一块饼。
代码如下:
/* * 1969_2.cpp * * Created on: 2013年8月14日 * Author: Administrator */ #include <stdio.h> #include <math.h> #include <string.h> double V[10001]; int N,F; //PI尽量用反余弦函数来算,否则可能精度不够 const double PI = acos(-1.0); /** * 输入饼的面积,判断能否够分 * 若以此面积分割后所得的饼的块数>=人数,则够分 * 否则不够分 */ bool test(double x){ //num .用来记录三块大馅饼最终能分成多少个小馅饼 int num = 0; int i; for( i = 1 ; i <= N ; ++i){ //V[i]/x 。计算每块馅饼能分成多少个小馅饼.其中的int体现了"每个人手中的馅饼不能是拼接而成的" num += int(V[i]/x); } //判断小馅饼数与朋友数的大小 if( num >= F){ return true; }else { return false; } } int main(){ int t; scanf("%d",&t); while(t--){ memset(V,0,sizeof(V)); scanf("%d%d",&N,&F); F = F+1; int i; double sum = 0; for( i = 1 ; i <= N ; ++i){ int r; scanf("%d",&r); V[i] = PI*r*r; sum += V[i]; } double max = sum/F; double l = 0; double r = max; double mid ; while( r - l > 1e-6){//注意这里的精度问题 mid = (r+l)/2; if(test(mid)){ l = mid; }else{ r = mid; } } printf("%.4lf ",(l+r)/2); } }