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 }
时间: 2024-10-05 00:12:46