POJ 3122 分派(二分)
描述
我有N个不同口味、不同大小的派。
有F个朋友会来参加我的派对,每个人会拿到一块派(不能由几个派的小块拼成;可以是一整个派)。
所有人拿到的派必须是同样大小的(但不需要是同样形状的)。
当然,我也要给自己留一块,而这一块也要和其他人的同样大小。
每个派都是一个高为1,半径不等的圆柱体。
请问我们每个人拿到的派最大是多少?
Input
第一行输入一个T代表组数。
随后T组包含两个正整数N和F,1 ≤ N, F ≤ 10000和N个1到10000之间的整数,表示派的数量,朋友的数量和每个派的半径。
Output
输出每个人能得到的最大的派的体积,精确到小数点后四位。
Sample Input
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2
Sample Output
25.1327
3.1416
50.2655
第一次写文章记录acm,出现问题是:
为什么要这样写:
why二分法
时间小 逐步逼近精确值
网友说法(不是很懂):每个人分最多分所有派里面积最大的,要么无限小(这是答案范围);卡答案的条件就是能不能分得到,显然是用二分答案的
所以二分答案的题目 比较直接的问法 最小值最大 一看就是二分答案了,但是比较隐形的问法 首先要看看有这么几个特点1 能确定答案范围 2有卡答案的条件
首先采用二分 要求到小数点后四位
【代码】
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define PI acos(-1.0)// acos(-1.0)就是求-1.0的反余弦,经计算,acos(-1.0) 的值就是圆周率
int N,F;
double pi[10010];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int i,sum;
double max=0,min=0,mid;
scanf("%d%d",&N,&F);
for(int i=0;i<N;i++)
{
double r = 0;
scanf("%lf",&r);
pi[i]=r*r;//此处是求体积 h=1 没有乘PI 为了防止后面循环误差叠加
if(max<pi[i])
max=pi[i];//确定max
}
while(max-min>0.0000001)//精确 因为要到小数点位 二分答案的套路过程
{
mid=(min+max)/2;//找到那个最中间的面积
sum=0;
for(int i=0;i<N;i++)//这下面一段都是判断
{
sum=sum+(int)(pi[i]/mid); //pi[i]分mid这么大可以分的人数的和
}//一定要统一格式 后面也要扩起来 要不然只是改变了pi
if(sum>=F+1)//可以分的人数的和是否大于总人数(加自己
{
min=mid;//可以分,左边的就向右
}
else
max=mid;//不能分,则右边的像左
}//逐步逼近精确
printf("%.4lf\n",mid*PI);//printf格式化输出会自动四舍五入;
} return 0;
}
总结:
一、思路问题
首先搞清楚怎么以面积的方式来判断是否能分
每个人会拿到一块派(不能由几个派的小块拼成;可以是一整个派)。
所有人拿到的派必须是同样大小的(但不需要是同样形状的)。
WTF???
找了原版说明
My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N of them, of various tastes and of various sizes. F of my friends are coming to my party and each of them gets a piece of pie. This should be one piece of one pie, not several small pieces since that looks messy. This piece can be one whole pie though.
My friends are very annoying and if one of them gets a bigger piece than the others, they start complaining. Therefore all of them should get equally sized (but not necessarily equally shaped) pieces, even if this leads to some pie getting spoiled (which is better than spoiling the party). Of course, I want a piece of pie for myself too, and that piece should also be of the same size.
What is the largest possible piece size all of us can get? All the pies are cylindrical in shape and they all have the same height 1, but the radii of the pies can be different
分的面积mid只能是(最大派的面积-0)之间
(每个派面积pi[i]/分的面积mid)的总和为总人数 再和实际人数(加自己)比较 进行判断 逼近分的面积
二、细节问题
(1)
WA很多次 是因为PI的处理 虽然写了很长一串以为很精确,实则一开始就算出每个派的面积 会导致后面循环误差叠加 使得某一样例WA
采取acos(-1.0)作为PI的值 且在最后输出的时候再乘PI
(2)
sum=sum+(int)(pi[i]/mid);
pi[i]与mid都是double型 sum为int型 所以要转换一下 转换方式如上
主要是这个题意太难懂了,我真的头晕,搞得我二分没学懂一样
第一次写有关acm的blog,希望能快快提升自己的能力吧