UVa Live 3635

题目

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1636


题意

f+1个人分n个派,要求每个人得到面积相同(但形状可以不一样的)一块。求该最大面积。

思路

为了不像刘书思路,直接选取了当前最大的分块面积。

注意: 最终可能只吃其中的几个,较小的可能不用!

感想

1. 较小的可能不用,谢谢test case

2. 虽然简单,但是较小的可能不用!这个原则非常重要!

代码

#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <tuple>
#define LOCAL_DEBUG
using namespace std;
typedef pair<double, int> MyPair;
const int MAXN = 1e4 + 4;
const double PI = acos(-1.0);
double areas[MAXN];
int partNums[MAXN];

int main() {
#ifdef LOCAL_DEBUG
    freopen("C:\Users\Iris\source\repos\ACM\ACM\input.txt", "r", stdin);
    //freopen("C:\Users\Iris\source\repos\ACM\ACM\output.txt", "w", stdout);
#endif // LOCAL_DEBUG
    int T;
    scanf("%d", &T);
    for (int ti = 1; ti <= T; ti++) {
        int n, f;
        scanf("%d%d", &n, &f);
        f++;
        double ans = 1e9;
        for (int i = 0; i < n; i++) {
            int r;
            scanf("%d", &r);
            areas[i] = r * r * PI;
        }
        int num = 0;
        priority_queue<MyPair> que;
        for (int i = 0; i < n; i++) {
            partNums[i] = 0;
            que.push(MyPair(areas[i], i));
        }
        while (num < f) {
            ans = min(ans, que.top().first);
            int ind = que.top().second;
            que.pop();
            partNums[ind]++;
            num++;
            que.push(MyPair(areas[ind] / (partNums[ind] + 1), ind));
        }
        printf("%.4f
", ans);
    }

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/xuesu/p/10388999.html