POJ3122贪心或者二分(分蛋糕)
生活随笔
收集整理的這篇文章主要介紹了
POJ3122贪心或者二分(分蛋糕)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? ?m+1個人來分n個蛋糕,每個人分到的蛋糕數必須一樣而且還必須是同一個蛋糕上的,問每個人最多分多少蛋糕?
思路:
? ? ? ?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\n",Ans);}return 0; }
總結
以上是生活随笔為你收集整理的POJ3122贪心或者二分(分蛋糕)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ3070矩阵快速幂简单题
- 下一篇: POJ3233不错的矩阵(矩阵套矩阵)