题目链接:http://poj.org/problem?id=3122

题目大意:

有 n 块披萨(大小不一样), f 个人分,包含主人自己 f+1 人;
每人吃的披萨必须是一块披萨上切下来的。每个人吃的披萨相等,披萨可以有剩余。求每人吃的最大披萨面积。

思路:

  • 假设每人分得的披萨面积等效为半径 R的圆;
  • 每块披萨可以分给几个人呢? r[i] 表示披萨半径,则是 r[i]2/R2 取整个人
  • 然后全部累加起来,如果总和大于等于 f+1,则每个人还有分更大的披萨的可能,R取值增大
  • 如果总和小于 f+1,则每个人分的太大了,不够分的,R取值减小
  • R的取值范围在(0,max(r[i]))

Wrong Answer代码

/*** @description: 有 n 块披萨(大小不一样), f 个人分,包含主人自己 f+1 人;*                  每人吃的披萨必须是一块披萨上切下来的。求* @author: michael ming* @date: 2019/4/20 0:23* @modified by: */
#include <iostream>
#include <iomanip>
#define PI 3.14159265359
using namespace std;
const double error = 1e-7;
double find_max_R(size_t pizza_num, int *r_pizza, double r_low, double r_high, size_t people)
{double R_we_want = r_low+(r_high-r_low)/2;size_t people_get_pizza = 0;while(r_high - r_low > error){people_get_pizza = 0;R_we_want = r_low+(r_high-r_low)/2;for(int i = 0; i < pizza_num; ++i)people_get_pizza += (int)(r_pizza[i]*r_pizza[i]/(R_we_want*R_we_want));if(people_get_pizza >= people)r_low = R_we_want;elser_high = R_we_want;}return R_we_want;
}
int main()
{size_t t, pizza_num, friend_num;double r_max_pizza = 0;cin >> t;while(t--){cin >> pizza_num >> friend_num;int *r_pizza = new int [pizza_num];for(int i = 0; i < pizza_num; ++i){cin >> r_pizza[i];r_max_pizza = r_pizza[i] > r_max_pizza ? r_pizza[i] : r_max_pizza;}r_max_pizza = find_max_R(pizza_num,r_pizza,0,r_max_pizza,friend_num+1);cout << setiosflags(ios::fixed) << setprecision(4) << PI*r_max_pizza*r_max_pizza << endl;delete[] r_pizza;r_pizza = NULL;}return 0;
}

AC代码(主要修改,精度问题,把求人数的除法改成减法)

/*** @description: 有 n 块披萨(大小不一样), f 个人分,包含主人自己 f+1 人;*                  每人吃的披萨必须是一块披萨上切下来的。求* @author: michael ming* @date: 2019/4/20 0:23* @modified by: */
#include <iostream>
#include <iomanip>
#include <math.h>
#include <algorithm>
#define PI acos(-1.0)
using namespace std;
const double error = 1e-7;
double find_max_R(size_t pizza_num, double *s_pizza, double s_low, double s_high, size_t people)
{double S_we_want = s_low+(s_high-s_low)/2.0;size_t people_get_pizza = 0;while(s_high - s_low > error){people_get_pizza = 0;S_we_want = s_low+(s_high-s_low)/2.0;for(int i = 0; i < pizza_num; ++i){double temp = s_pizza[i];while(temp-S_we_want>=0){temp -= S_we_want;   //改成减法,不易丢失精度people_get_pizza++;}}if(people_get_pizza >= people)s_low = S_we_want;elses_high = S_we_want;}return S_we_want;
}
int main()
{size_t t, pizza_num, friend_num;double s_max_pizza = 0.0;cin >> t;while(t--){cin >> pizza_num >> friend_num;double *s_pizza = new double [pizza_num];for(int i = 0; i < pizza_num; ++i){cin >> s_pizza[i];s_pizza[i] *= s_pizza[i];}sort(s_pizza, s_pizza+pizza_num);s_max_pizza = find_max_R(pizza_num,s_pizza,0,s_pizza[pizza_num-1],friend_num+1);cout << setiosflags(ios::fixed) << setprecision(4) << PI*s_max_pizza << endl;delete[] s_pizza;s_pizza = NULL;}return 0;
}

POJ 3122 分披萨(二分查找)相关推荐

  1. C语言(CED)查找最接近的元素(分治法/二分查找):在一个非降序列中,查找与给定值最接近的元素。(递归实现)

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 一.题目大意 查找最接近的元素(分治法/二分查找):在一 ...

  2. [POJ 2503] Babelfish【二分查找】

    题目大意 给你一个词典,每行有两个字符串x,y,表示y翻译成x. 一行空行隔开. 给你一些单词y,问你翻译后的x,如果词典里没有,那么就输出"eh" 解题报告 C++调map,还可 ...

  3. POJ 3122 Pie【二分答案】

    题意:求每个人能分到的所有蛋糕中最大的面积,像是第1个蛋糕分到2,第2个分到4,那结果是4 关于精度问题 我无力吐槽 本来是二分半径的,结果还是转分面积了 #include <iostream& ...

  4. poj 3104 Drying(二分查找)

    题目链接:http://poj.org/problem?id=3104 Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  5. c语言分蛋糕均匀正方形,分蛋糕(C - 二分查找)

    分蛋糕 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/C Description My birthd ...

  6. 习题1.8 二分查找 (20 分)

    习题1.8 二分查找 (20 分) 本题要求实现二分查找算法. 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中List结构定义如下 ...

  7. POJ 2785 有多少种4个数相加等于0的方案(二分查找 or hash)

    文章目录 1.二分查找法 1.1 思路: 1.2 AC代码 2.hash查找法 2.1 思路: 2.2 Wrong Answer 代码 2.3 Time Limit Exceeded 代码 2.4 偷 ...

  8. POJ 1064 分割线缆(二分查找)

    题目链接:http://poj.org/problem?id=1064 题目大意:多根电缆切成指定段数(每段相同长度),求每段线缆的最大长度(精确到0.01) 这题精度控制是难点,方法很简单,二分查找 ...

  9. 7-60 二分查找法之过程 (10 分)

    7-60 二分查找法之过程 (10 分) 本题要求使用二分查找法,在给定的n个升序排列的整数中查找x,并输出查找过程中每一步的中间结果.如果数组a中的元素与x的值相同,输出相应的下标(下标从0开始): ...

最新文章

  1. “积水上报”广获好评 畅移信息接棒 “互联网+政务”落地
  2. 【Flutter】Flutter 拍照示例 ( 拍照并获取照片源码示例 | image_picker 0.7.2+1 | Flutter 最新 SDK 安装 )
  3. MySQL存储过程和函数(一)
  4. basic中next转为c语言,[转载]混乱c语言代码写的basic解释器
  5. boost互斥锁_boost锁使用总结
  6. 3.过滤——简单移动平均线概念(SMA)、SMA的假设、加权移动平均线概念(WMA)_1
  7. 解决java.io.IOException: HTTPS hostname wrong: should be
  8. 剑指offer面试题05. 替换空格
  9. printk与syslog(至少在Redhat中是这样的)+Ubuntu下用最简单的读到/proc/kmsg
  10. 数控车床 刀尖补偿用法 G41 G42 G40
  11. 电脑上找不到蓝牙图标,怎么打开蓝牙,三种方法教你打开蓝牙。
  12. 整数平方一定大于零吗?
  13. 青龙面板nvjdc诺兰自定义公告页面
  14. starUML建立模型及生成代码框架
  15. GX works2 三菱PLC 显示注释后代码行变宽的解决方法
  16. 大数据开发跟大数据分析的区别是什么?
  17. 微信消息提醒python实现
  18. 世界500强和中国500强企业名单(2004年度前100名)
  19. ELISPOT酶联免疫斑点技术说明书
  20. Maven入门 (IDEA环境下的使用在第十三部分)

热门文章

  1. 用计算机计算出密码,自带计算器的密码
  2. android studio创建文件,如何在Android Studio中创建File Templates
  3. 单片机oled显示浮点数函数_问中文编程在单片机上实现一个电子时钟,总共有几步?...
  4. 【洛谷p1464】 Function
  5. Uoj 441 保卫王国
  6. mysql 5.6.38 数据库编译安装
  7. zipline-benchmarks.py文件改写
  8. stm32F1使用SD卡实现IAP
  9. [解题报告]HDU 1249 三角形
  10. notify_one() 或 notify_all() 在c++中的使用要点