POJ 3122 分派(二分)

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,希望能快快提升自己的能力吧

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值