uvalive 3635 Pie

https://vjudge.net/problem/UVALive-3635

题意:

有F+1个人要分n个蛋糕,他们得到的蛋糕的面积必须是一样的,但是每个蛋糕必须是整块的蛋糕,而不是有多块蛋糕拼成的,蛋糕的形状也可以不相同。

给出n块蛋糕各自的半径,求他们每个人能得到的蛋糕的最大面积。

思路:

使得最小值最大,那显然是二分。

二分半径,计算面积,然后枚举每个蛋糕,计算每个蛋糕可以分出来的当前面积的蛋糕会有多少个,总数是否大于等于F+1即可。

记住计算个数的时候要用floor向下取整函数,而且l从0开始枚举(因为人数可能比蛋糕个数多),r从半径的最大值开始枚举就行了。

代码:

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const double pi = acos(-1.0);
 7 
 8 int a[10005];
 9 int n,f;
10 
11 bool meet(double r)
12 {
13     double area = pi * r * r;
14 
15     long long sum = 0;
16 
17     for (int i = 0;i < n;i++)
18     {
19         double one = pi * a[i] * a[i];
20 
21         sum += (int)floor(one / area);
22 
23         //printf("%f %f %d\n",one,area,(int)floor(one / area));
24     }
25 
26     return sum >= f;
27 }
28 
29 int main()
30 {
31     int t;
32 
33     scanf("%d",&t);
34 
35     while (t--)
36     {
37         scanf("%d%d",&n,&f);
38 
39         f++;
40 
41         int maxn = -1;
42 
43         for (int i = 0;i < n;i++)
44         {
45             scanf("%d",&a[i]);
46 
47             maxn = max(a[i],maxn);
48         }
49 
50 
51         sort(a,a+n);
52 
53         double l = 0,r = maxn;
54 
55         for (int i = 0;i < 100;i++)
56         {
57             double mid = (l + r) / 2;
58 
59             if (meet(mid)) l = mid;
60             else r = mid;
61         }
62 
63         printf("%.5lf\n",l * pi * l);
64     }
65 
66     return 0;
67 }

 

posted @ 2017-09-29 08:45  qrfkickit  阅读(142)  评论(0编辑  收藏  举报