初试二分法

二分原理

在高中方程根这一相关内容中我们就接触过二分法;二分原理并不是很陌生

就是在一个大范围内每次根据数据不断折半缩小范围,找到近似解。(不再过多赘述)

Pie

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17735 Accepted Submission(s): 6215

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. This should be one piece of one pie, not several small pieces since that looks messy. This piece can be one whole pie though.

My friends are very annoying and if one of them gets a bigger piece than the others, they start complaining. Therefore all of them should get equally sized (but not necessarily equally shaped) pieces, even if this leads to some pie getting spoiled (which is better than spoiling the party). Of course, I want a piece of pie for myself too, and that piece should also be of the same size.

What is the largest possible piece size all of us can get? All the pies are cylindrical in shape and they all have the same height 1, but the radii of the pies can be different.

Input

One line with a positive integer: the number of test cases. Then for each test case:
---One line with two integers N and F with 1 <= N, F <= 10 000: the number of pies and the number of friends.
---One line with N integers ri with 1 <= ri <= 10 000: the radii of the pies.

Output

For each test case, output one line with the largest possible volume V such that me and my friends can all get a pie piece of size V. The answer should be given as a floating point number with an absolute error of at most 10^(-3).

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

解题思路

若干的小伙伴分若干块饼。小饼扔掉;大饼分开;所以每次用二分法求出分饼的大小后代回判断是否满足每个小伙伴都有形同大小饼的要求。

代码样例

#include <bits/stdc++.h>
using namespace std;
const double PI=acos(-1.0);
const double jd=1e-6;       //这里控制精度,本题要求精度到小数点后四位,可以改为1e-4
double pine[10005];
int t,nr,np;

int check(double mid)
{
    int sum=0;
    for(int i=0; i < nr; i++)
        sum+=(int)(pine[i]/mid);
    if(sum > np)
        return 1;
    else
        return 0;
}

int main()
{
    cin >> t;
    while(t--)
    {
        double ri=0;
        double le=0,mid;
        cin >> nr >> np;
        for(int i=0; i < nr; i++)
        {
            int r;
            cin >> r;
            pine[i]=PI*r*r;
            ri+=pine[i];        //这里的二分初始最大边界可以另设一个大数
        }
        while(ri-le > jd)
        {
            mid=(ri+le)/2;
            if(check(mid))
                le=mid;
            else
                ri=mid;
        }
        printf("%.4lf\n",mid);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/cafu-chino/p/10262470.html

时间: 2024-11-01 19:46:44

初试二分法的相关文章

day05匿名函数,内置函数,二分法,递归,模块

yield作为表达式来使用的方式 #grep -rl 'python /root """ 查找root下文件中含有python的文件 """ import os def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper @init def search(target): while True: search

Ubuntu Nginx uwsgi django 初试

/************************************************************************************** * Ubuntu Nginx uwsgi django 初试 * 说明: * 最近打算通过Python搭建一个数据收集的网站,先做一个搭建测试. * * 2016-8-5 深圳 南山平山村 曾剑锋 ***************************************************************

Python写个二分法查找

笔者是一个通信测试攻城狮,之前做过一段时间的持续集成.工作内容只要就是对主线版本进行基本通信功能守护,测试执行都是自动化完成,也是那个时候开始接触到代码. 当时经常遇到的一个问题是:某一天我们发现版本有重大BUG,但是到上一次我们验证PASS中间已经经历过很多版本,我们需要手动从中间找到第一个出现BUG的版本,当然最简单的方法是二分法,取中间版本,根据有没有BUG再缩小范围,继续取中间版本...当时我的想法就是思路很固定,完全可以自动化完成,可惜当时我不会写代码...直到今天看Python递归函

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

Windows Phone开发(2):竖立自信,初试锋茫

上一篇文章中,我们聊了一些"大炮"话题,从这篇文章开始,我们一起来学习WP开发吧. 一.我们有哪些装备. 安装完VS 学习版 for WP后,也连同SDK一并安装了,不必像安卓那样,安装JDK,下载IDE,还要装SDK和Eclipse插件.WP开发环境是可以一键安装的. 1.模拟器. 这个东东应该说比较重要,如果我们没有现成的WP手机怎么办?模拟器就帮我解决这个问题,我们不需要购买WP手机也可以进行WP应用开发,更何况,我们不可能什么时候都要在真实手机上运行,那调试也不方便. 启动模拟

uwsgi 配置 初试

/************************************************************************************** * uwsgi 配置 初试 * 说明: * 将uwsgi命令行参数改成配置文件中的参数. * * 2016-8-6 深圳 南山平山村 曾剑锋 *************************************************************************************/ 一.sh

二分法练习1

在房神的激励下我开始预习二分法啦~ poj3273 Monthly Expense (二分,最大值最小化) 题意:将N个账款分割成M个财务期,使得每个分期账款和的最大值最小. 题解:贪心思想,二分法.上界为N天花费总和,下界为每天花费的最大值.根据mid值遍历n天花费看是否满足M各财务期条件 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int main(){ 5 int n,m,i,cnt,a[

LeetCode 1 Two Sum(二分法)

题目来源:https://leetcode.com/problems/two-sum/ Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1

03-1. 二分法求多项式单根

二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0. 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2:否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2): 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根:否则 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环: