有些內容使用中英雙語,有些只有英文或中文。歡迎使用與分享任何內容,但先來信告知並標示此部落格為出處。
Some parts use both Chinese and English, but some parts use only one language. Feel free to share, but please contact me first and list this blog as your reference.

2014年2月13日 星期四

PKU OJ - 3122 Pie

The following program is my ACcepted code for PKU OJ 3122 Pie
It's a for everybody to learn and discuss.
If there is any mistake or comment, please let me know.  :D

此乃PKU 3122 的AC code!
歡迎一同討論學習,如有錯誤與任何建議請留言 : )

點這裡看題目 Click here to see this Problem!
//This program is for PKU 3122 Pie
//http://poj.org/problem?id=3122

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>//for the acos()
#define Pi acos(-1.0)
#define eps 1e-5

int N, F;//N is number of pies, F is number of friends
int r[10001];

/*
canbe function use to check whether this size is
     
@num record the number of pieces of pie if we use parameter "size" to separate pie.

@tmpNum is the number of each pie can be separated if we use parameter "size" to separate pie.
 Because "tmpNum" is integer, the decimal point will be omit automatically.
 Ex: if parameter "size" is bigger any pie, tmpNum will be 0 automatically.

if "num" is equal or bigger than (F+1)(including the author),
then this "size" would be possible, which is true for this function.
*/
bool canbe(double size)
{
    int num = 0, tmpNum;
 
    for(int i=0; i<N; i++)
    {
        tmpNum = (r[i] * r[i] * Pi)/size;
        num += tmpNum;
    }
 
    if(num >= (F+1))
        return true;
    else
        return false;
}

/*
findSize function use the binary search to search the maximum(largest) possible size

@the variable beg is the possible minimum size,
 which is that only the largest pie will be separated in the party
   
@the variable end is the possible maximum size,
 which is that we can use all the pies in the party, and there is no left pie.
*/
double findSize(double beg, double end)
{
    double mid;
 
    do
    {
        mid = (beg + end)/2.0;
     
        //printf("before: %lf  %lf %lf\n", beg, mid, end);//for check
     
        if(canbe(mid))  beg = mid;
        else            end = mid;
     
        //printf("after : %lf %lf %lf\n", beg, mid, end);//for check

    }while( fabs(end - beg)>eps );
 
    return end;
}

int main()
{
    int t;//test case
    double maxR = 0.0, sumR = 0.0;
 
    scanf("%d", &t);
 
    while(t--)
    {
        scanf("%d %d", &N, &F);
     
        maxR = 0.0;
        sumR = 0.0;
     
        for(int i=0;i < N; i++)
        {
            scanf("%d", &r[i]);
            maxR = r[i] > maxR ? r[i] : maxR;
            sumR += r[i];// add all the radius
        }
     
        //printf("%lf %lf\n", (maxR * maxR * Pi)/(F+1), (sumR * sumR * Pi)/(F+1));
        printf("%.4lf\n", findSize( (maxR * maxR * Pi)/(F+1), (sumR * sumR * Pi)/(F+1) ));
    }
    return 0;
}


Please feel free to use it after adding this blog as an reference. (http://autekroy.blogspot.tw) If there is any mistake or comment, please let me know. :D 

歡迎使用與分享任何內容,但請記得標示此部落格為出處。(http://autekroy.blogspot.tw/) 如果有發現任何的錯誤與建議請留言或跟我連絡。 : )

沒有留言:

張貼留言

請留下您的任何想法或建議!
Please leave any thought or comment!