POJ - 3122 Pie(二分)

http://poj.org/problem?id=3122

题意

主人过生日,m个人来庆生,有n块派,m+1个人(还有主人自己)分,问每个人分到的最大体积的派是多大,PS每 个人所分的派必须是在同一个派上切下来的。

分析

二分答案,每次统计当前体积下能分配的人数。

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define lc idx<<1
#define rc idx<<1|1
#define rson mid+1,r,rc
#define lson l,mid,lc
using namespace std;
typedef long long ll;
template <class T>
void test(T a) {
    cout<<a<<endl;
}
template <class T,class T2>
void test(T a,T2 b) {
    cout<<a<<" "<<b<<endl;
}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c) {
    cout<<a<<" "<<b<<" "<<c<<endl;
}
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1e9+7;
int T;
void testcase() {
    printf("Case %d: ",++T);
}
const int MAXN = 1e5+10;
const int MAXM = 30;
const double PI = acos(-1.0);
const double eps = 1e-7;
double pie[MAXN];
int n,m;
int main() {
#ifdef LOCAL
    freopen("data.in","r",stdin);
#endif // LOCAL
    int T;
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d",&n,&m);
        double maxx = 0;
        for(int i=0; i<n; i++) {
            scanf("%lf",&pie[i]);
            pie[i] *= pie[i];
            if(maxx<pie[i]) {
                maxx = pie[i];
            }
        }
        m  = m + 1;
        double l = 0;
        double r = maxx;
        double mid;
        while(r-l>eps) {
            mid = (r+l)/2;
            int sum = 0;
            for(int i=0; i<n; i++) {
                if(pie[i]-mid>eps) {
                    sum += (int)pie[i]/mid;
                }
            }
            if(sum>=m) l = mid;
            else r = mid;
        }
        printf("%.4f\n",mid*PI);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/fht-litost/p/9348659.html
今日推荐