poj3122-Pie(二分法+贪心思想)

一,题意:
  有f+1个人(包括自己),n块披萨pie,给你每块pie的半径,要你公平的把尽可能多的pie分给每一个人
  而且每个人得到的那份pie必须是从同一个pie上得到的,不能拼凑,多余的边角丢掉。
二,思路:
  1,输入,并找出最大体积的pie
  2,二分法记录每一种情况的体积,及能分给几个人,
   贪心的思想:
    先取能分给n-1个人的最大体积,逐渐减少每份pie的体积
    直到最接近n个人都能获得的pie的最大的体积
  3, 输出。
三,步骤:
  1,输入,max存储最大的pie体积
  2,二分法:
    i,退出条件max-min <= 1e-6;
     由n-1个人体积慢慢减少,逐渐接近n个人的体积,
     最后mid存储的pie体积即为每个人分得的最大体积。
    ii,count记录pie能分的份数
    iii, 如果份数 < 人数,减少每份pie的体积,即max = mid ; mid = (min+max)/2;
     否则,增加每份pie的体积,即min = mid ; mid = (min+max)/2;
  3,输出:注意控制输出的小数位数。

setprecision、fixed、showpoint的用法总结

 1 #include<iostream>
 2 #include<iomanip>
 3 using namespace std;
 4 const double PI = 3.14159265359; //这是最短的PI长度,再短就WA了
 5 const double esp = 1e-6; //为了double二分法设定的最小精度限制值
 6 double pie[10050];
 7
 8 int main(){
 9     int t , n , f; //n表示一开始pie的份数,f表示朋友的人数
10     cin>>t;
11     while(t--){
12         cin>>n>>f;
13         f++;       //人数加上自己
14         double max = 0.0;
15         for(int i = 0 ; i < n ; i++){
16             cin>>pie[i];
17             pie[i] *= pie[i];  ////半径平方,计算pie的体积时先不乘PI,为了提高精度和减少时间
18             if(max<pie[i])
19                 max = pie[i];  //记录最大pie的体积
20         }
21         double min = 0.0 ;    //注意改为0,会出错
22         double mid ;
23         while(max-min>esp){   //实数double的二分结束条件不同于整数int的二分结束条件
24             mid = (min + max)/2;
25             int count = 0 ;   //记录根据不同的mid尺寸能分多少份数
26             for(int i = 0 ; i < n ; i++){
27                 count += (int)(pie[i]/mid);//第i个pie按照mid的尺寸去切,最多能分的人数(取整)
28             }
29             if(count < f) max = mid ; //mid偏大
30             else min = mid ;          //mid偏小
31         //    cout<<count<<"-"<<mid<<" "; //输出一下,你会发现其中的奥妙。
32         }
33         cout<<fixed<<setprecision(4)<<PI*mid<<endl;//fixed与setprecision配合使用规定小数点后的位数
34     }
35     return 0;
36 }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 15:17:57

poj3122-Pie(二分法+贪心思想)的相关文章

hdu 4105 贪心思想

淋漓尽致的贪心思想 波谷一定是一位数,波峰一位数不够大的时候添加到两位数就一定够大了的. 当在寻找波谷碰到零了就自然当成波谷. 当在寻找波峰时碰到零时,将前面的波谷加到前一个波峰上,让当前的零做波谷,使得波谷的值尽量小,这就是本题最关键的贪心思想,一直想不到. 代码中:a表示前一个值,b表示当前考虑的值,tag为偶数时表示正在寻找波谷,奇数时在寻找波峰. #include<iostream> #include<cstdio> #include<cstring> #inc

POJ 3253 Fence Repair 类似哈夫曼树的贪心思想

Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24550   Accepted: 7878 Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000)

NOIP2012BLOCKADE贪心思想证明

这道题的做法是二分时间并检验这个时间是否可行.检验的方法要用到贪心思想. 对于不能到根结点的军队应该尽量向根结点走. 如果军队A能走到根结点但到根结点后剩余的时间不够返回根结点的儿子B,应该让军队A守B. 否则把军队A加入优先队列,用剩余时间小的军队匹配到根结点距离小的儿子. 证明: 一个军队可控制自己和以自己为根的子树.越向上走控制的结点越多. 把这个军队记作A,如果不这样,我们必须要用另一个到达根结点的军队,记作C,因为A剩余时间小于到B的时间,如果用C,则C剩余的时间大于到B的时间,这样交

POJ3544 Journey with Pigs 动规基础贪心思想

非常经典的贪心题目,没有严格证明的话,肯定是YY着做的,题意: 约翰要从A到B,途中会经过N个村庄,他会带N只猪,然后卖掉,每个村庄卖一只,第i个村庄的人出价pi 每斤,从A到第i个存在的距离为disi,而且运一只猪需要话花费t * disi每斤,t一开始会给定 输入第一行n,t 接下来第一行 n个数,代表各个猪的重量 在接下来第二行n个数,代表每个村庄距离A的距离dis 在接下来第三行n个数,代表每个村庄出价p 输出n个数,表示每个村庄买的哪只猪 这题目一开始看到就往dp方向去想,但是发现不行

uva 10020- Minimal coverage (贪心思想 简单区间覆盖)

题目大意:给出一个范围M,然后给出若干的区间,以0 0 终止, 要求用最少的区间将0 ~M 覆盖,输出最少个数以及方案. 解题思路:典型的区间覆盖问题,算法竞赛入门经典P154上有讲. /*author: charkj_z */ /*time: 0.108s */ /*rank: 674 */ /*为什么不把没用的地方去掉? 因为去掉了我觉得不像我能写出来的*/ /*Ac code : */ #include<stdio.h> #include<string.h> #include

图论——关于Dijkstra的贪心思想

引语 作为求解最短路问题的算法中最稳健的算法,Dijkstra以其惊奇的操作和独特的魅力,吸引了无数OIer学习.钻研.身为一名蒟蒻,本人以有限的能力付诸仔细的思考,对于Dijkstra算法中贪心思想的正确性有了新的认识. 咳咳,相信我,这是一篇很正常的博客,本人也是一名很正常的博主. 大多数OIer在初学Dijkstra算法时都不求甚解,单纯的把板子背下来就算了,而对于其中的贪心思想的内涵并没有做过深入挖掘.对于其贪心算法的正确性,我以我个人的理解,进行非严格的证明,希望有助于大家理解Dijk

算法之贪心思想

这个贪心的行为在算法中也成为了一种指导思想,也就是说贪心算法所作出的选择在当时的环境下是最好的,说深一点就是它只是某种 意义上的局部最优解,但不一定是全局最优解,此时往往接近于最优解. 一: 优点 前面也说了,贪心只是求的当前环境下的最优解,而不是追究整体的最优解,所以贪心就避免了为求的整体最优解而枚举各种方案所 耗费的时间. 二: 问题 ① 不能保证贪心所得出的解是整体最优的. ② 不能用来求最大解和最小解问题. ③ 只能求满足某些约束条件的可行解的范围. 三: 案例 其实说到贪心,基本上都会

UVa714 Copying Books (二分法,贪心)

链接:http://vjudge.net/problem/UVA-714 分析:二分枚举最小值,用贪心的思想每段序列尽量往右划分,注意:因为要求字典序最小解,输出时还有一个贪心过程,左起S[i]尽量小,相当于右起S[j]尽量大,还有一种情况是剩下的数之和已经小于等于ans,但是此时剩余要分配的组数还有多(remain>1). 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 usin

cf12D Ball(MAP,排序,贪心思想)

题意: N位女士一起聚在一个舞厅.每位女士有三个特征值B,I,R.分别代表美貌,智慧,富有. 对于一位女士而言,如果存在一个女士的B,I,R都分别大于她自己的B,I,R.则她自己会自杀. 统计总共有多少个女士会自杀. 1 ≤ N ≤ 500000 0 ≤ Bi, Ii, Ri ≤ 109 思路: 这题想不出来.看了题解后觉得很妙. 思想和最长上升子序列的贪心做法有相像的地方. 按B从小到大排,若B相等按I自大到小排,若I相等,按R从小到大排. *:存在map里的东西(map[key]=val)必