FAQ | About | Google Group | Discuss | Author
All Copyright Reserved ©2010-2016 HUST ACM/ICPC TEAM
Server Time: 2016-08-22 16:07:08 GMT+8
这是一道关于生日的时候分饼的问题。要求是每个人分到的饼的体积要相同,并且只能由一块大饼分成小饼,而不能是几块小饼拼凑成一块大的。题目先输入一个数表示一共有多少组数据,然后输入两个整数表示饼的个数和朋友的人数,再接着输入每个饼的半径。我们要求的是每个人可以分到的最大的饼的体积。(要注意的是计算人数的时候一定要加上自己)当看到这道题目的时候我的第一想法是通过将饼的大小进行排序,在根据人数的多少从大到小的顺序进行分饼,这就要判断每个饼分到人后的体积与下一个饼的体积的比较,还有体积的计算都不好算。后来我到网上找了思路才知道这道题目用二分法做比较简单。先求出每个人能分到的最大的体积,即总体积除以总人数,然后对每个人将要分到的体积进行二分,将每个饼除以这个体积求出这些饼可以分成多少人,若此人数大于总人数就扩大二分法的左边值继续进行二分,反之就减小二分法的右值在进行二分,最后求出分到的最大体积。
#include <iostream>
#include<stdio.h>
#include <iomanip>
#include <cmath>
#define pi acos(-1.0)
double V[1000];
using namespace std;
int A,B;
int test(double mid)
{
int num=0;
int i;
for(i=0;i<A;i++)
num+=(int)(V[i]/mid);
if(num>B)
return 1;
else
return 0;
}
int main()
{
int i,n,r;
double v,R,L,mid;
scanf("%d",&n);
while(n--)
{
v=0;
scanf("%d%d",&A,&B);
for(i=0;i<A;i++)
{
scanf("%lf",&V[i]);
V[i]=V[i]*V[i]*pi;
v+=V[i];
}
L=0;
R=v/(B+1);
while(fabs(R-L)>1e-6)
{
mid=(L+R)/2;
if(test(mid)==1)
L=mid;
else
R=mid;
}
printf("%.4lf\n",L);
}
}