zoukankan      html  css  js  c++  java
  • UVA12097

    题面

    题意

    这里有 (n) 个派,(f+1) 个人(由于题面中说有 (f) 个朋友,加上我自己,一共是 (f+1) 个人)需要平分这些派,每个人分到的面积必须相同,并且每个人分到的都必须是一整块(原来的派可以切开)。

    解法

    简单二分答案,二分每个人分到的派的面积。其中 check 函数的功能是对于你找出的每个人分得的派的面积,求出一共能切出几块这样的派。详情见代码。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int n, f;
    double area[10005];
    
    bool check(double s) {  //返回当每个人分到的面积为s时能分出来的块数
        int tot = 0;
        for (int i = 1; i <= n; i++)
            tot += floor(area[i] / s);
        return tot >= f;
    }
    
    int main() {
        double pi = acos(-1);
        int T;
        scanf("%d", &T);
        while (T--) {
            scanf("%d%d", &n, &f);
            f++;
            double l = 0, r = 0;
            for (int i = 1; i <= n; i++) {
                double t;
                cin >> t;
                area[i] = (double)t * t * pi;
                r = max(r, area[i]);
            }
            while (l <= r) {//二分每个人分到的面积
                double mid = (l + r) / 2;
                if (check(mid))
                    l = mid + 0.00001;
                else
                    r = mid - 0.00001;
            }
            printf("%.4lf
    ", check(l) ? l : r);
        }
        return 0;
    }
    
  • 相关阅读:
    [SCOI2007]降雨量
    [SCOI2005]骑士精神
    LUOGU P1342 请柬
    spfa的复活
    Luogu P2396 yyy loves Maths VII
    Luogu P2801 教主的魔法
    HEOI2012 采花
    USACO05DEC Cleaning Shifts
    CF438D The Child and Sequence
    Codechef October Challenge 2019 Div.2
  • 原文地址:https://www.cnblogs.com/macesuted/p/solution-UVA12097.html
Copyright © 2011-2022 走看看