POJ3122贪心或者二分(分蛋糕)

题意:
       m+1个人来分n个蛋糕,每个人分到的蛋糕数必须一样而且还必须是同一个蛋糕上的,问每个人最多分多少蛋糕?


思路:

     能想到的方法有两种,一个是直接贪心,另一个就是二分,这个题目之前做过,用的是二分,但不知道为啥这次看到的时候,没感觉。也没去想二分,直接自己想了一个贪心的策略然后就AC了,先说贪心,贪心我们可以一个一个人的去分,每个人来的时候就在当前状态中选择一个蛋糕如果把它加到分这个蛋糕的人中后是加到所有别的蛋糕后每人得到最大的,感觉很别扭,说不清楚,直接看下面代码把,其实很容易理解,然后在说说二分的解法,我没去敲,以前用二分解过这个题目,就是枚举答案,对于每一个枚举的答案我们可以去算当前答案能得到的最多蛋糕数,就是相除取整然后相加,根据这个和来决定二分的走向,看讨论说这个题目卡精度卡的很严格,我没啥感觉,因为我的π用的是这个PI=acos(-1.0),所以没被卡到。下面是贪心的代码,二分的没写。


#include<math.h>
#include<queue>
#include<stdio.h>
#include<string.h>
#include<algorithm>


using namespace std;

typedef struct NODE
{
    int p;
    double sum ,per;

    friend bool operator < (NODE a ,NODE b)
    {
        return a.per < b.per;
    }
}NODE;


NODE node[11000];
NODE xin ,tou;

int main ()
{
    int t ,n ,m ,i;
    double PI=acos(-1.0);
    double r;
    scanf("%d" ,&t);
    while(t--)
    {
        scanf("%d %d" ,&n ,&m);
        priority_queue<NODE>q;
        for(i = 1 ;i <= n ;i ++)
        {
            scanf("%lf" ,&r);
            node[i].per = node[i].sum = PI * r * r;
            node[i].p = 1;
            q.push(node[i]);
        }
        m ++;
        double Ans = 1000000000;
        while(m--)
        {
            tou = q.top();
            q.pop();
            if(Ans > tou.per) Ans = tou.per;
            tou.p ++;
            tou.per = tou.sum / tou.p;
            q.push(tou);
        }

        printf("%.4lf
",Ans);
    }
    return 0;
}



原文地址:https://www.cnblogs.com/csnd/p/12062440.html