题目
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; }