3122--Pie
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 23475 | Accepted: 7316 | Special Judge |
http://poj.org/problem?id=3122
我的生日快到了,传统上我正在为馅饼做饭。 不只是一个馅饼,不,我有N个,各种口味和各种尺寸。 我朋友的朋友来参加我的聚会,他们每个人都会得到一块馅饼。 这应该是一块馅饼,而不是几块小块,因为它看起来很乱。 这件作品可以是一个完整的馅饼。
我的朋友非常讨厌,如果他们中的一个比其他人更大,他们就开始抱怨了。 因此,所有这些都应该得到相同大小(但不一定相同的形状)的碎片,即使这会导致一些馅饼被破坏(这比破坏派对更好)。 当然,我也想要一块馅饼,而且那块也应该是相同的大小。
我们所有人都能获得的最大尺寸是多少? 所有的馅饼都是圆柱形的,它们都具有相同的高度1,但是馅饼的半径可以是不同的。
输入:
一行带有正整数:测试用例的数量。 然后针对每个测试用例:
一行有两个整数N和F,1≤N,F≤10000:馅饼的数量和朋友的数量。
一行N个整数ri,1≤ri≤10000:馅饼的半径。
输出:
对于每个测试用例,输出一行具有最大可能音量V的行,这样我和我的朋友都可以得到一个大小为V的饼。答案应该是一个浮点数,绝对误差至多为10-3。
翻译题意:
我生日派对时,准备了N个圆柱形的pie,半径比一定相同,但高都为1,
我邀请了F个朋友,加上自己一共F+1人,需要将N个pie分给F+1个人
要求:每个人分得的pie尺寸要一样大,
并且同一个人所分的pie要是从同一个pie上得到的,n个pie分完后可以有剩余
求:每个人最多可以分多少?
分析:设左界l=0,即每人都分不到;右界r=maxr的pie大小,即每人都得到整个pie,而且那个pie为所有pie中最大的
重点!同一个人所分的pie都来自同一个pie,
若每个人所分的最大体积为a,那么比a小的pie肯定得舍弃。(转自他人)
对当前上下界折中为mid,计算"如果按照mid的尺寸分pie,能分给多少人"(直接在最大那块的面积与0之间二分求即可)
求某个pie(尺寸为size)按照mid的尺寸,能够分给的人数,就直接size / mid,舍弃小数就可以 (int (a[i]/mid))
重中之重:精度问题--1e-5
代码:
#include <iostream>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=10000+10;
const double pi=3.141592653589;
int n,m;
double a[maxn],maxa;
void solve()
{
double l=0,r=maxa*maxa*pi*10000,mid;
int ans=0;
while(r-l>1e-5)
{
ans=0;
mid=(l+r)/2;
for(int i=0;i<n;i++)
ans+=int (a[i]/mid);
if(ans<m)
r=mid;
else l=mid;
}
printf("%.3lf\n",l);
}
int main()
{
cin>>n>>m;
m++;
maxa=0;
double t;
for(int i=0;i<n;i++)
{
scanf("%lf",&t);
a[i]=t*t*pi;
maxa=max(maxa,a[i]);
}
solve();
return 0;
}