1. 程式人生 > >二分查詢-POJ 3122-Pie

二分查詢-POJ 3122-Pie

題目連線:Pie

題目大意:

有N張餅,k個朋友,為了體面,必須把餅切割成大小一樣的k+1塊(包括主人自己),求出每個人能得到的最大餅體積。

前提:每人一塊,餅可以有剩餘

二分去暴力答案,確定下界為0,上界為最大體積的餅(每人一塊,最大可能就是餅的體積都相等,也就是每塊都是最大值)。

程式碼:

#include<stdio.h>
#include<math.h>
#define MAX_SIZE 100005
#define max(a,b) (a>b?a:b)
#define Pi acos(-1.0)    //圓周率
#define eps 1e-6

double Volume[MAX_SIZE];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int N,F,ri;
        while(~scanf("%d%d",&N,&F))
        {
            //printf("%lf\n",Pi);
            double Max=-1;
            for(int i=0;i<N;i++)
            {
                scanf("%d",&ri);
                Volume[i]=ri*ri*Pi;
                Max=max(Max,Volume[i]);    //求出最大體積的Pie
            }

            double l=0.0,r=Max;
            double Mid;
            while(r-l>eps)
            {
                Mid=(l+r)/2;
                int cnt=0;
                for(int i=0;i<N;i++)
                    cnt+=(int)(Volume[i]/Mid);    //按mid切割(取整)
                if(cnt>=F+1)    //能分配的人大於F+1,往上取值
                    l=Mid;
                else
                    r=Mid;
            }
            printf("%.4lf\n",Mid);
        }
    }
    return 0;
}