Pie UVA - 12097 二分法

让人想犯罪 __ 提交于 2020-03-02 01:45:16

问题

分析

这道题和前面的题目有些相似之处,类似于最小值最大问题,但并不是,因为每个人要求一样大,假设答案是x,那么有的人分到x是因为只能得到x那么大的,有的人得到x是因为最小的是x,再多就切不出来了,实际上可以拿到一块大于x的派。
矛盾:只有一种矛盾,x太大,每块派只能切出πri2/x\pi*r_i^2/x块,加在一块小于f+1

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>

using namespace std;
typedef long long LL;
const int maxn=10005,Inf=0x3f3f3f3f;
int T,n,f,pie[maxn];
double s[maxn],maxs;

inline bool check(double x){
    int ans=0;
    for(int i=0;i<n;++i){
        ans+=s[i]/x;
    }
    return ans>=f;
}

int main(void){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&f);
        ++f;
        maxs=-1;
        for(int i=0;i<n;++i) {
            scanf("%d",&pie[i]);
            s[i]=M_PI*pie[i]*pie[i];
            maxs=max(maxs,s[i]);
        }
        double left=0,right=maxs;
        while(right-left>1e-6){
            double mid=(left+right)/2;
            if(check(mid)) left=mid;
            else right=mid;
        }
        printf("%.4lf\n",left);
    }
    return 0;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!