Pie(二分法)
2015-08-05 21:47
197 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/C
题意:
我过生日请了F个朋友参加我的生日party,m个蛋糕,我要把它平均分给每个人(包括我),每个人的蛋糕都是整块整块的,并且分的蛋糕大小要一样(形状可以不一样),每块蛋糕都是圆柱,高度都是1。每个朋友(包括我)最多可以分到的蛋糕面积是多少。
案例:
input
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2
output
25.1327
3.1314
50.2655
思路分析:
采用二分查找,找出最大的面积所在区间。
逐步的缩小范围,最后当左右端点相差小于0.00001时,即可取左端点为最大的面积。
确定是左是右区间时,可以记录每个蛋糕的可以分的人数的和,比较它与F的大小就可以但到目的。
源代码如下:
题意:
我过生日请了F个朋友参加我的生日party,m个蛋糕,我要把它平均分给每个人(包括我),每个人的蛋糕都是整块整块的,并且分的蛋糕大小要一样(形状可以不一样),每块蛋糕都是圆柱,高度都是1。每个朋友(包括我)最多可以分到的蛋糕面积是多少。
案例:
input
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2
output
25.1327
3.1314
50.2655
思路分析:
采用二分查找,找出最大的面积所在区间。
逐步的缩小范围,最后当左右端点相差小于0.00001时,即可取左端点为最大的面积。
确定是左是右区间时,可以记录每个蛋糕的可以分的人数的和,比较它与F的大小就可以但到目的。
源代码如下:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int N,F; double are[10010]; double pi=acos(-1.0); bool judge(double area) { int count=0; for(int i=0;i<N;i++) { count+=(int)(are[i]/area); //记录每个蛋糕可以分到的人数的总和 } if(count>=(F+1)) return true; //不要忘记包括我 else return false; } void max_area(double maxn) { double l,r,mid; l=0;r=maxn; while(r-l>0.00001) //二分 { mid=(l+r)/2; if(judge(mid)) l=mid; else r=mid; } printf("%.4f\n",l); } int main() { int t,r; cin>>t; while(t--) { double maxn=-1; cin>>N>>F; for(int i=0;i<N;i++) { cin>>r; are[i]=r*r*pi; if(maxn<are[i]) maxn=are[i]; } max_area(maxn); } return 0; }
相关文章推荐
- [leedcode 210] Course Schedule II
- 【iOS知识学习】_iOS动态改变TableView Cell高度
- 小白学开发(iOS)OC_ set方法的内存管理分析(2015-08-04)
- 自定义注解定义和使用
- sass与less区别
- leetcode数据库sql之Delete Duplicate Emails
- poj 2456 Aggressive cows (二分)
- hdu 4033 2011成都赛区网络赛 余弦定理+二分 **
- HDU 5352 - MZL's City(网络流‘最小费用流)
- ubuntu下jni的简单使用,不使用ndk工具
- VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
- ACM 快速幂模板 HDU4365
- CYQ多数据库链接
- IOS不同层的传输格式
- 小白学开发(iOS)OC_多个对象的内存管理(2015-08-03)
- Sublime text 2/3 中 Package Control 的安装与使用方法
- PHP get_class 返回对象的类名
- HDU 5352 MZL's City(最小费用最大流)经典 2015 Multi-University Training Contest 5
- hdu-1016
- Combination Sum (II)