【noiOJ】p8211 (PS:二分浮点数的精度问题)

05:派

总时间限制: 
1000ms

内存限制: 
65536kB
描述

我的生日要到了!根据习俗,我需要将一些派分给大家。我有N个不同口味、不同大小的派。有F个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成;可以是一整个派)。

我的朋友们都特别小气,如果有人拿到更大的一块,就会开始抱怨。因此所有人拿到的派是同样大小的(但不需要是同样形状的),虽然这样有些派会被浪费,但总比搞砸整个派对好。当然,我也要给自己留一块,而这一块也要和其他人的同样大小。

请问我们每个人拿到的派最大是多少?每个派都是一个高为1,半径不等的圆柱体。

输入
第一行包含两个正整数N和F,1 ≤ N, F ≤ 10 000,表示派的数量和朋友的数量。
第二行包含N个1到10000之间的整数,表示每个派的半径。
输出
输出每个人能得到的最大的派的体积,精确到小数点后三位。
样例输入
3 3
4 3 3
样例输出
25.133惨痛的教训:浮点数最好转化成整数再算,不然精度有问题。
#include <iostream>
#include <cstdio>
using namespace std;
double r,l,mid;
double a[10010];
int n,k,sum;
int judge(double x)
{
    int ans,i;
    ans=0;
    for (i=1;i<=n;i++)
        ans+=a[i]/x;
    return ans;
}
int main()
{
    int i;
    scanf("%d%d",&n,&k);
    l=0; r=0;
    for (i=1;i<=n;i++)
    {
        scanf("%lf",&a[i]);
        a[i]=a[i]*a[i]*3.141592653589793*100000;
        r=max(r,a[i]);
    }
    //r=3.14159263589793*100000*100000;
    sum=0;
    while (l<r)
    {
        mid=(r+l)/2;
        sum=judge(mid);
        if (sum>=k+1)
            l=mid;
        else
            r=mid;
        if (r-l<1)
            break;
    }
    if (judge(r)==k+1)
        printf("%.3lf",r/100000);
    else
        printf("%.3lf",l/100000);
    return 0;
}

时间: 2024-08-09 02:03:45

【noiOJ】p8211 (PS:二分浮点数的精度问题)的相关文章

MATLAB的eps,浮点数相对精度

MATLAB的eps函数,官方帮助文档是这么描述的:Floating-point relateive accuracy,也就是浮点数的相对精度. 大家都知道,在数学中,实数有无穷多个,数值可以无限大,精度也可以无限小.而在计算机中,因为表示数值的字长有限,不可能无限地表示一个数的有效数字.所以在计算机中,是没有绝对概念上的无穷大和无穷小的.两个相邻数字(中间不能再有其他数值)的“间隔”,就是一般意义上的相对精度.(相对精度的具体含义可以自行Baidu,也可以参见这个帖子:关于Matlab的eps

PHP浮点数运算精度造成的,订单金额支付经常少1分的问题

最近碰见一个奇怪的问题,商城通过微信支付的订单经常少一分钱,经过排查是PHP浮点运算精度问题造成的 由PHP浮点数运算精度造成的,鸟哥的Bolg有详细的说明.http://www.laruence.com/2013/03/26/2884.html, 小数在二进制表示时,0.58对于二进制,是无限长的值 0.58的二进制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111 0.57的二进制表示基本上(52位)是: 001

js中浮点数的精度问题

JS中浮点数的精度问题 value = parseFloat((value.toFixed(2))).toLocaleString(); //大于1的数值没有问题,小于1的,个位数的0会丢失,如:0.1,转换之后:.1 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} try{r2=arg2.toString().split("

HDU 1007 Quoit Design(二分+浮点数精度控制)

Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 47104    Accepted Submission(s): 12318 Problem Description Have you ever played quoit in a playground? Quoit is a game in which fla

js中的浮点数运算精度问题

js中的浮点数精度一般可以达到16位有效数字,因此有人使用parseFloat(x.toFixed(12))来提高js中浮点运算的精度. 经验证,这种方法当整数位数较少时基本正确,但对于较大或较小的运算结果是无效的,如1222.31*2344,直接运算结果是2865094.6399999997,parseFloat((1222.31*2344).toFixed(12))后仍然是2865094.6399999997,并未提升精度. 此时,应该先将结果归一化后再进行toFixed(12)这样的处理,

CodeForces 801C 二分,浮点数

CodeForces 801C 题意: n个设备,第 i个设备每秒用电a[i],原本储存电量b[i].只有一个充电器,每秒可给一个设备充电 p.所有的设备要同时工作,问最多可以工作多长时间? tags:就是二分,但写挂了好多发.. 坑点: 1.右边界会爆1e9 ... 2.担心 double 会丢失精度,用了 long double. 然后long double ,头文件 #include <iomanip.h> .一开始用 printf("%.6Lf\n", r)输出,在

关于js浮点数计算精度不准确问题的解决办法

今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精度的文章.觉得别人写的挺好了,我在简单的总结一下,以方便后续查阅. 浮点数误差产生的原因: 先看一个实例: 0.1 + 0.2 =? 0.1 + 0.2 = 0.3? 我们先来看一段 JS. console.log( 0.1+ 0.2); 输出为 0.30000000000000004.是不是很奇葩

golang 浮点数 取精度的效率对比

需求 浮点数取2位精度输出 实现 代码 package main import ( "time" "log" "strconv" "fmt" ) func main() { threadCount := 100000 fa := 3.233667 time1 := TestFn(threadCount,fa,func(fa float64) string{ return strconv.FormatFloat(fa,'f',2

js float浮点数计算精度问题

/** * floatObj 包含加减乘除四个方法,能确保浮点数运算不丢失精度 * * 我们知道计算机编程语言里浮点数计算会存在精度丢失问题(或称舍入误差),其根本原因是二进制和实现位数限制有些数无法有限表示 * 以下是十进制小数对应的二进制表示 * 0.1 >> 0.0001 1001 1001 1001…(1001无限循环) * 0.2 >> 0.0011 0011 0011 0011…(0011无限循环) * 计算机里每种数据类型的存储是一个有限宽度,比如 JavaScrip