【二分】Pie

来源:互联网 发布:广播系统 杰网络 编辑:程序博客网 时间:2024/05/17 21:47

题目

  题目地址:Pie。


思路

  这题刚看到的时候依然是毫无思路,看了别人的解题报告才得知可以用二分法……妙啊。
  二分的过程就是在枚举每个人可以分得的面积,计算在该面积下多少人可以得到pie。如果能得到pie的人数少于总人数,说明现在的面积太大了,调整上限;否则,则说明现在的面积还可以更小一些,调整下限。


代码

// 二分查找#include<iostream>#include<algorithm>#include<iomanip>using namespace std;#define BOUND 1e-6#define pi 3.14159265359bool cmp(double a, double b){    return a > b;}double cakeSize[10001];int caseNum, cakeNum, peopleNum;double findSize(double lower, double upper){    if (upper - lower > BOUND) {        int cnt = 0;        double mid = (lower + upper) / 2;        for (int i = 0; i < cakeNum; ++i)            cnt += int(cakeSize[i] / mid);        if (cnt < peopleNum) // 说明现在的形状太大了            mid = findSize(lower, mid);        else // 说明现在的形状太小,还可以再大一点儿            mid = findSize(mid, upper);        return mid;    }    return lower;}int main(){    double maxSize = 0;    cin >> caseNum;    while (caseNum--) {        cin >> cakeNum >> peopleNum;        ++peopleNum;        for (int i = 0; i < cakeNum; ++i) {            cin >> cakeSize[i];            cakeSize[i] *= cakeSize[i];            if (cakeSize[i] > maxSize)                maxSize = cakeSize[i];        }        sort(cakeSize, cakeSize + cakeNum, cmp); // sort from big to small        double rst = findSize(0, maxSize);        cout << fixed << setprecision(4) << pi * rst << endl;    }    system("pause");}
0 0