分披萨

题意:

My birthday is coming up and traditionally I’m serving pie. Not just one pie, no, I have a numberN of them,

of various tastes and of various sizes. Fof my friends are coming to my party and each ofthem gets a piece

of pie. This should be one pieceof one pie, not several small pieces since that looksmessy. This piece can be one whole pie though.My friends are very annoying and if one of themgets a bigger piece than the others, they start complaining.Therefore all of them should get equallysized (but not necessarily equally shaped) pieces,even if this leads to some pie getting spoiled (whichis better than spoiling the party). Of course, I wanta 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 andthey all have the same height 1, but the radii of the pies can be different.

Input
  One line with a positive integer: the number of test cases. Then for each test case:
• One line with two integers N and F with 1 ≤ N, F ≤ 10000: the number of pies and the number
of friends.
• One line with N integers ri with 1 ≤ ri ≤ 10000: the radii of the pies.

Output
For each test case, output one line with the largest possible volume V such that me and my friends can
all get a pie piece of size V . The answer should be given as a oating point number with an absolute
error of at most 10−3
.
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

思路:二分。根据每个人所得的披萨在最小份—所有的的披萨平均后之间,那么就可以利用二分法来从中间找

源代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 using namespace std;
 6 #define maxn 10000+5
 7 double pi = acos(-1.0);    //π
 8 int  N, F,rid[maxn];
 9 double v[maxn];
10 double vi,mk,left, right, mid;
11 bool judge(double M)
12 {
13     int sum = 0;
14     for (int i = 0; i < N; i++)
15         sum += int(v[i]/M);      //能分到的人数
16     if (sum>=F)                 //与实际人数做比较
17         return true;
18     else
19         return false;
20
21 }
22 int main()
23 {
24     int T;
25     cin >> T;
26     while (T--)
27     {
28         memset(v, 0, sizeof(v));
29         memset(rid, 0, sizeof(rid));
30         double left, right, mid;
31         cin >> N >> F;
32         F = F + 1;                 //加上自己
33         for (int i = 0; i < N; i++)
34         {
35             cin >> rid[i];
36             v[i] = pi*rid[i] * rid[i];
37             vi += v[i];
38         }
39         mk = vi / F;               //
40         left = 0.0;
41         right = mk;
42         while ((right - left)>1e-6)  //控制精度
43         {
44             mid = (left + right) / 2;
45             if (judge(mid))            //判断是大了还是小了
46                 left = mid;            //大了
47             else
48                 right = mid;           //小了
49         }
50         printf("%.4f\n", mid);
51
52     }
53
54     return 0;
55
56 }
时间: 2024-09-30 01:52:23

分披萨的相关文章

poj3122--二分加贪心

大致题意: 就是公平地分披萨pie 我生日,买了n个pie,找来f个朋友,那么总人数共f+1人 每个pie都是高为1的圆柱体,输入这n个pie的每一个尺寸(半径),如果要公平地把pie分给每一个人(就是所有人得到的pie尺寸一致,但是形状可以不同),而且每个人得到的那份pie必须是从同一个pie上得到的 后面那句很重要, 就是说如果有3个pie, 尺寸分别为1,2,3, 如果要给每人尺寸为2的pie,那么最多分给2个人,而不是3个人 因为第一个pie尺寸为1,小于2,扔掉 第二个pie尺寸为2,

涨知识:数学家又发现了平分披萨的新方法

在分披萨时,有没有纠结怎样分大小才相等?好消息来了,现在有一群数学家教你怎样将披萨分成大小都一样的奇葩形状. 在分披萨时有一个已被证明的数学定理(披萨定理),但大多讲的都是圆形几何学.但这阻止不了这群来自利物浦大学的数学家去研究新的分披萨方法. 这个方法是建立在一个把完整的披萨分成 6 块相等的弧形(有点像盾牌的形状)披萨,然后每块对半切变成 12 块大小相等的披萨实验上的.就像这样: 这个新方法可以让你用更复杂的切法依然能切出面积相等的披萨.这个方法主要是切出一块像盾牌形状的披萨就行了,注意第

LeetCode 1388. Pizza With 3n Slices(3n 块披萨)(DP)

给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨: 你挑选 任意 一块披萨.Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨.Bob 将会挑选你所选择的披萨顺时针方向的下一块披萨.重复上述过程直到没有披萨剩下.每一块披萨的大小按顺时针方向由循环数组 slices 表示. 请你返回你可以获得的披萨大小总和的最大值. 示例 1: 输入:slices = [1,2,3,4,5,6]输出:10解释:选择大小为 4 的披萨,Alice 和 Bob 分别挑选

898B. Proper Nutrition#买啤酒问题(枚举&amp;取余)

题目出处:http://codeforces.com/problemset/problem/898/B 题目大意:为一个整数能否由另外两个整数个整数合成 #include<iostream> using namespace std; int main(){ int n,a,b; cin>>n>>a>>b; if(n%2==1 && a%2==0 && b%2==0 ){cout<<"NO"<

一个简单的文件管理程序

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

如何理解云计算?很简单,就像吃货想吃披萨了

你一定听说过云计算中的三个"高大上"的你一定听说过云计算中的三个"高大上"的概念:IaaS.PaaS和SaaS,这几个术语并不好理解.不过,如果你是个吃货,还喜欢披萨,这个问题就好解决了! 一个"吃货"是怎样吃到披萨的呢? 1.在家自己做 这真是个麻烦事,你的准备很多东西,发面.做面团.进烤箱.....简单列一下,需要下图所示的一切: 2.买好速食披萨回家自己做着吃 你只需要从披萨店里买回成品,回家烘焙就好了,在自己的餐桌上吃.和自己在家做不同,

【转】如何理解云计算?很简单,就像吃货想吃披萨了

你一定听说过云计算中的三个"高大上"的概念:IaaS.PaaS和SaaS.这几个术语并不好理解.不过,如果你是个吃货,还喜欢披萨,这个问题就好解决了!好吧,其实你根本不是一个吃货,之所以自我标榜为吃货,其实是为了收获赞叹式的夸奖,"吃货还这么瘦,好羡慕啊!"或者,总得给伦家的微丰找个像样的理由. 一个"吃货"是怎样吃到披萨的呢? 1. 在家自己做 这真是个麻烦事,你的准备很多东西,发面.做面团.进烤箱.....简单列一下,需要下图所示的一切: 2

c# partial 分部类和分部方法

一.partial 它是一个关键字修饰符.可以将类或结构.接口或方法的定义拆分到两个或更多个源文件中. 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.修饰符不可用于委托或枚举声明中. 二.分部类 在以下几种情况下需要拆分类定义: 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理. 使用自动生成的源时,无需重新创建源文件便可将代码添加到类中. Visual Studio 在创建 Windows 窗体.Web 服务包装器代码等时都使用此方法.

MySQL分库分表方案

1. MySQL分库分表方案 1.1. 问题: 1.2. 回答: 1.2.1. 最好的切分MySQL的方式就是:除非万不得已,否则不要去干它. 1.2.2. 你的SQL语句不再是声明式的(declarative) 1.2.3. 你招致了大量的网络延时 1.2.4. 你失去了SQL的许多强大能力 1.2.5. MySQL没有API保证异步查询返回顺序结果 1.2.6. 总结 MySQL分库分表方案 翻译一个stackoverflow上的问答,关于分库分表的缺点的,原文链接: MySQL shard