POJ-3122(二分算法)

//题意:这是一个分蛋糕的游戏, t个测试数据,输入n, f  n代表的是n块蛋糕,蛋糕的高为1, f代表的是f个人朋友,然后输入每份蛋糕的半径
//      将n块蛋糕分成 f+1 份 每一份都是完成的一块蛋糕,但是可以形状不一样,就每个人最大的蛋糕体积 v  ,
//注意 pi 精度不能小于   3.14159265359
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
const double pi=3.14159265359;

const double eps=0.000001;
int a[10005];
using namespace std;

int main(){
    int t;
    cin>>t;
    while(t--){
        int n, f;
        double sum = 0;
        cin>>n>>f;
        f = f+1;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++){
            cin>>a[i];
            a[i] = a[i]*a[i];
            sum += a[i];
        }
        double left = 0, right = sum/f, mid;
        while(right-left>eps){
            mid = (right+left)/2;
            int ant = 0;
            for(int i=1;i<=n;i++){
                ant += (int)(a[i]/mid);
            }
            if(ant>=f)left = mid;
            else right = mid;
        }

        printf("%.4f",mid*pi);
        if(t!=0)printf("\n");
    }
}

原文地址:https://www.cnblogs.com/0526yao/p/10474316.html

时间: 2024-11-05 20:26:05

POJ-3122(二分算法)的相关文章

poj 3122 (二分查找)

链接:poj 3122 题意:我生日派对时,准备了n个圆柱形的pie,半径比一定相同,但高都为1, 邀请了f个朋友,加上自己一共f+1人,需要将n个pie分给f+1个人 要求:每个人分得的pie尺寸要一样大, 并且同一个人所分的pie要是从同一个pie上得到的,n个pie分完后可以有剩余 求:每个人最多可以分多少 分析:因为同一个人所分的pie都来自同一个pie, 若每个人所分的最大体积为a,那么比a小的pie肯定得舍弃. 将每个人最多分得的pie看成半径为r的圆柱,则最大尺寸为PI*r*r*1

POJ 3122 Pie 二分答案

Pie Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9653   Accepted: 3478   Special Judge Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N of them, of various tastes and of v

POJ 3122-Pie(二分+精度)

题目地址:POJ 3122 题意:给出n个pie的直径.有F+1个人,假设给每人分的大小同样(形状能够不同),每一个人能够分多少.要求是分出来的每一份必须出自同一个pi(既当pie大小为3.2,1,仅仅能分出两个大小为2的份,剩下两个要扔掉.) 思路:对每个人分的大小进行二分. 注意讲pi放在最后成.能够提高精度. Ps:wa了5发.不知道错在哪,然后把输出的%lf改成%f就A了,并不知道为什么...sad #include <stdio.h> #include <math.h>

递归和二分算法

递归程序调用自身的编程方法称为递归(recursion) 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无线的集合.一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回. 递归的两个条件: 1,每一次的调用都会使问题的规模有所减少 2,必须有一个明确的终止条件 python中测试的递归

POJ 1379 模拟退火算法

求规定平面上一点到已知点的最小距离最大的点. 模拟退火的流程是,随机构造几组解作为初始解空间,每次对当前解空间进行随机扩展,若发现更优解则替换. 进行的次数由参数人为控制,而随机扩展的幅度也是随着次数逐渐减小的. #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #include<string> #include&

二分算法的一些思考

二分算法的思想: 通过不断减小问题规模,从边界条件出发求解问题.(通常是单调性问题,判定形式较为简单) 二分算法的优点: 1.把n的时间复杂度优化到logn 2.将一个问题转化为判定性质问题求解 代码: while(l<=r) { if(check(mid) { ans = mid; r = mid-1; } else ans = mid+1; } 例题: block towers n个人选择n个不同2的倍数的数,m个人选择m个3的倍数的数,选择的最大数字最小!

二分算法模板

二分算法求最值,掌握了算法的本质和模板,主要就是答案验证过程,验证过程经常使用贪心算法. 关键是根据题目要求设立命题check(x). 验证答案mid: Check(mid):是否成立? 求满足条件Check(mid)的最小值: –if  check(mid) then r:=mid else l:=mid+1; 求满足条件Check(mid)的最大值: –if  check(mid) then l:=mid else r:=mid-1; 模板一:求满足条件check(mid)的最小值. 1 /

二分算法和三分算法

二分算法: hdu1969    PIE 题意:f+1个人分n分pie,pie只能切开不能从组,也就是说每个人拿到的必须是一个整块,不能是多个碎块.要求每个人分的的大小一样.n份pie的大小不同.目标是求出没人可能吃到的最大大小V. 分析抽象:首先条件是必须够n个人吃,要求大小一样的情况下求最大的V.关系是随着V的增大,所能support的人越少.这里有一个非递增的关系.所以而已考虑二分法.问题对精度的要求是二分法使用的关键.要求保留4位小数,所以我们统一乘上1000000来计算. #inclu

POJ 2485(Kruskal算法)

第一道Kruskal算法题 #include <iostream>#include <algorithm>#include <cstdio>using namespace std;#define max 505int f[max],maxw;struct edge{    int st,en,w;}ed[max*max/2]; int  find(int k){    if(k!=f[k])f[k]=find(f[k]);    return f[k];}void co

POJ 3525 二分+半平面交

Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3812   Accepted: 1779   Special Judge Description The main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is natural t