HDU 1969 Pie (二分查找)

题目链接:click here~~

题目大意:n块馅饼分给m+1个人,每一个人的馅饼必须是整块的。馅饼能够被切开。但不能组合,也不一定要所有分完,问你每一个人最大能分到多大体积的馅饼面积。

【解题思路】:二分,对于每一个V值,我们枚举相应情况下人数P的多少,发现是单调递减的,因此二分查找区间,初始值left=0,right=inf;然后judge函数推断当前mid值是否能使得p>=m,因此累计ans=num[i]/mid,写的时候二分用的是while推断,怎么调试答案就是差了那么一点点。后来索性改成for循环。结果立马就出来了,看来有时候实在不知道那错了,换一种写法可能就对了

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
const int inf=1e10;
const int eps=1e-6;
const double pi=acos(-1.0);
double num[N];
int n,m;
bool get(double mid)
{
    int  ans=0;
    for(int i=1; i<=n; i++){
        ans+=(int)floor(num[i]/mid);
    }
    return ans>=m;//确保m+1个人每人都能得到最大面积
}
int main()
{
    //freopen("1.txt","r",stdin);
    int t,tot=1;
    scanf("%d",&t);
    while(t--)
    {
        double c,sum=0,maxx=0;
        scanf("%d%d",&n,&m);m+=1;
        for(int i=1; i<=n; i++){
            scanf("%lf",&c);
            num[i]=c*c*pi;
        }
        double ll=0,rr=inf;
        //printf("ll==%.4lf rr==%.4lf\n",ll,rr);
       for(int i=1;i<=100;i++){
            double mid=(ll+rr)/2;
            if(get(mid)) ll=mid;
            else rr=mid;
        }
       // printf("%.4f\n",mid);
        printf("%.4f\n",ll);
       // printf("%.4f\n",rr);
    }
    return 0;
}
/*
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
*/
时间: 2024-10-23 07:02:35

HDU 1969 Pie (二分查找)的相关文章

HDU 1969 Pie 二分

1.题意:一项分圆饼的任务,一堆圆饼共有N个,半径不同,厚度一样,要分给F+1个人.要求每个人分的一样多,圆饼允许切但是不允许拼接,也就是每个人拿到的最多是一个完整饼,或者一个被切掉一部分的饼,要求你算出每人能分到的饼的体积最大值.输入数据依次给出,测试数据组数T,每组数据中,给出N,F,以及N个圆饼的半径.输出最大体积的数值,精确到小数点后四位. 2.分析:一看是这种输出就知道用二分写会很高效,这里对"能分出的最大体积值"进行二分.首先,这个值有界,最大值为总体积除以总人数的值,即Σ

【hoj】2651 pie 二分查找

二分查找是一个很基本的算法,针对的是有序的数列,通过中间值的大小来判断接下来查找的是左半段还是右半段,直到中间值的大小等于要找到的数时或者中间值满足一定的条件就返回,所以当有些问题要求在一定范围内找到一个满足一些约束的值时就可以用二分查找,时间复杂度O(log n); 题目:http://acm.hit.edu.cn/hoj/problem/view?id=2651 因为题目有精度要求,对于浮点数小数点部分会有一定误差,所以可以选择将这些有小数部分的数值扩大e6倍,因为题目要求精确到e-3,之后

hdu 1969 Pie(二分查找)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1969 Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4513    Accepted Submission(s): 1819 Problem Description My birthday is coming up and trad

hdu 1969 Pie(贪心+二分查找)(简单)

Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5628    Accepted Submission(s): 2184 Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I

HDU 1969 (二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1969 Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4547    Accepted Submission(s): 1837 Problem Description My birthday is coming up and tra

hdu 1969 Pie

Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6752    Accepted Submission(s): 2564 Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I h

HDU 1969 Pie(二分法)

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 various sizes. F of my friends are coming to my party and each of them gets a piece of pie. This should be one piece

HDU 1969 Pie(二分搜索)

题目链接 Problem 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 various sizes. F of my friends are coming to my party and each of them gets a piece of pie.

HDU 5878---预处理+二分查找

给一个数n,让你求一个大于等于n的最小的满足题意中2^a*3^b*5^c*7^d的数字. 思路: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include <ctime> #include<queue> #include<set&g