HDU - 1969 Pie (二分查找)

6 篇文章 0 订阅

原题地址:
HDU-1969

题意解释:
有 F+1 个人分 N 个派吃,每个人吃的派必须体积相同,而且每个人只吃一块派,允许部分派被浪费。每个派是圆的,高度为1,半径由数据给出。

题目吐槽:
本来就是僧多粥少的分派吃,主人占据优势地位,要么大度点不吃,要么多吃点嘛,总想和客人吃相同大小的派,还非要发扬平均主义,每个人都吃体积一样的派。尤其是大家都有一个共同的癖好,都是不能接受食物碎屑的完美主义者,吃点剩下的能死啊。还有就是做派的师傅不走心,做出来的派大小不一,这派我要给差评!

解决方案:
二分搜索合适的分派方式
最小值是: 0 (大家都不吃)
最大值是:派的总体积 ÷ 总人数 (超完美平均主义)
每次取中间值 记作:mid,计算如果每个派切出 mid体积 能切多少块
如果能切够 F+1块,则将最小值更新为中间值
如果切不出 F+1块,则将最大值更新为中间值
直到两次中间值的差值 小于 10^(-4) 时就是结果了
如果评测不过。。。那就把精度调高一点吧

样例:
输入:
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2
输出:
25.1327
3.1416
50.2655

然后贴上自己代码:

#include<iostream>
#include<vector>
#include<cmath>
#include<iomanip>
using namespace std;
const double PI=acos(-1.0);
double core(int n,vector<int> &TT){
    double mmax=0,mmin=0,mid,dl=1;
    for(unsigned int i=0;i!=TT.size();i++){
        mmax+=TT[i]*TT[i]*PI;
    }
    mmax=mmax/n;
    while(fabs(dl)>0.000001){
        mid=(mmax+mmin)/2;
        int num=0;
        for(unsigned int i=0;i!=TT.size();i++){
            num+=(int)((TT[i]*TT[i]*PI)/mid);
        }
        if(num<n){
            mmax=mid;
        }else{
            mmin=mid;
        }
        dl=mmax-mmin;
    }
    return mid;
}
int main(){
    int T;
    cin>>T;
    while(T--){
        int n,f;
        cin>>n>>f;
        vector<int> T;
        while(n--){
            int val;
            cin>>val;
            T.push_back(val);
        }
        cout<<setiosflags(ios::fixed)<<setprecision(4)<<core(f+1,T)<<endl;
    }
    return 0;
}
//Designed by wolf
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值