zoukankan      html  css  js  c++  java
  • 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;
    }
    
    


  • 相关阅读:
    乘坐飞机时,有什么事情是机长和机上工作人员不想让乘客知道的?
    北京有哪些被废弃的地方值得一看?推荐理由是什么?
    在读硕士或博士是如何养活自己的?
    怎样有效提高记忆力?
    北京值得去的、不为人知的景点(或展览馆、美术馆、公园)有哪些?
    你收藏了哪些藏品?
    如何抓到入侵网站的黑客?
    中国姓氏的区域性?
    python之入门,你好,中国
    Eclipse 内置浏览器
  • 原文地址:https://www.cnblogs.com/csnd/p/12062440.html
Copyright © 2011-2022 走看看