27. 吃披萨

来源:互联网 发布:百慕大水下金字塔知乎 编辑:程序博客网 时间:2024/05/23 21:54

同学们都在辛苦编写程设的题目,为了犒劳大家,高老师决定请大家吃披萨。由于上课的人很多,一块披萨肯定是不够分的,但是披萨店里同种型号的披萨又没有那么多,所以外卖送过来的披萨大小都有。为了公平起见,高老师要给所有人分一样大块,可以剩下,但是绝不能将某两个披萨剩下的边角料拼到一起算作一块,当然,高老师自己也要一块。 现在你需要编写一个程序,帮助高老师算一算每个人能分到的披萨最大面积。 

输入

输入包含多组用例,多组测试用例间用空行分隔。

每组测试用例第一行包含两个正整数 m 和 n,其中 m 代表披萨的个数,n 代表程设课程的同学数,m 和 n 均在 10000 以下。第二行有 m 个数字,表示每个披萨的半径,为正整数。 

输出

针对每组测试用例,输出一个数字,表示每个同学能够分到披萨的最大面积。要求结果精度保留小数点后4位

测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助测试用例 1以文本方式显示
  1. 3 3↵
  2. 4 3 3↵
  3. 1 24↵
  4. 5↵
  5. 10 5↵
  6. 1 4 2 3 4 5 6 5 4 2↵
以文本方式显示
  1. 25.1327↵
  2. 3.1416↵
  3. 50.2655↵
1秒1024KB0



//贪心 + 二分//(贪心找最优解)最大的披萨可能会切开分,小的披萨可能不会去分,找出最优的Mid大的披萨,并且 >= m + 1 整数块//二分搜索出满足所有条件的最优的Mid,输出即可#include<stdio.h>#define PI 3.14159265358979323846int n, m;double size[10008];//Size of Piza;int Judge(double Size)//判断当每个人分到大小为Size的披萨是否满足题意{int Sum = 0;for (int i = 0; i<n; i++){Sum += (int)(size[i] / Size);//int(size[i]/mid)表示size[i]的披萨能分出多少块,Sum用来计算总共有多少块if (m <= Sum)//判断是否足够m个人分return 1;}return 0;}int main(){while (~scanf("%d %d", &n, &m)){m++; //高老师自己要一个披萨double Max_Size = 0, r;for (int i = 0; i<n; i++){scanf("%lf", &r);size[i] = r*r*PI;Max_Size = Max_Size > size[i] ? Max_Size : size[i];//最大面积的披萨 }double Left=0, Right=Max_Size, Mid;while (Right - Left >= 1e-7)//控制需要的精度 (当调到1e-7时才全A){Mid = Right + (Left - Right) / 2;if (Judge(Mid))Left = Mid;else Right = Mid;}printf("%.4lf\n", Left);}return 0;}







原创粉丝点击