Pie————二分+尺取练习

缺乏、安全感 2022-05-17 19:59 281阅读 0赞

给你n个蛋糕的半径,你有m个朋友,所以总共有m+1个人,现在要分蛋糕,要求每个人分到的大小都是一样的,且每个人的蛋糕都是从一块上切割下来的(不能是2个不同的蛋糕拼起来的),现在问每个人最多能分到多少蛋糕(体积),保留到小数点后4位输出。

Input
第一行是组数T,接下来是T组数据。
每组数据包含2行,第一行是n和m,均不超过10000,参考描述。
第二行是n个数,每个数表示一个蛋糕的半径,均不超过10000.

Output
对每组数据输出一个数一行,为分到的蛋糕的体积。

Sample Input
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2

Sample Output
25.1327
3.1416
50.2655

Hint
比如第二组
1 24
5
表示有一个半径是5的蛋糕,所以体积是25pi,现在你们有1+24个人分,每人能分到pi


找最大的蛋糕,进行二分

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const double PI=acos(-1.0);
  5. const int MAXN=1e4+9;
  6. int t,n,F;
  7. double l,r,mid;
  8. double a[MAXN];
  9. bool cmp(double a,double b)
  10. {
  11. return a>b;
  12. }
  13. int judge(double mid)
  14. {
  15. int ans=0;
  16. for(int i=0;i<n;i++)
  17. {
  18. ans+=int (a[i]/mid);
  19. if(ans>F) return 1;
  20. }
  21. return 0;
  22. }
  23. int main()
  24. {
  25. scanf("%d",&t);
  26. while(t--)
  27. {
  28. scanf("%d %d",&n,&F);
  29. for(int i=0;i<n;i++)
  30. {
  31. scanf("%lf",&a[i]);
  32. a[i]=a[i]*a[i]*PI;
  33. }
  34. sort(a,a+n,cmp);
  35. l=0;
  36. r=a[0];
  37. while(r-l>1e-5)
  38. {
  39. mid=(l+r)/2.0;
  40. if(judge(mid)) l=mid;
  41. else r=mid;
  42. }
  43. printf("%.4f\n",l);
  44. }
  45. return 0;
  46. }

发表评论

表情:
评论列表 (有 0 条评论,281人围观)

还没有评论,来说两句吧...

相关阅读

    相关 法总结

    一般地,当我们要去枚举满足条件的区间权值的区间,可以用遍历双指针 l 和 r 的做法去枚举第一个满足条件的区间,然后去维护其他数据,这样的做法就是尺取法,它的复杂度为O(n)

    相关 算法--

    尺取法 尺取法通常是指对数组保存一对下标(起点,终点),然后根据实际情况交替推进两个端点直到得出答案的方法,这种操作很像是尺取虫爬行的方式故得名。 我们先来看看POJ的

    相关 Pie————二分+练习

    给你n个蛋糕的半径,你有m个朋友,所以总共有m+1个人,现在要分蛋糕,要求每个人分到的大小都是一样的,且每个人的蛋糕都是从一块上切割下来的(不能是2个不同的蛋糕拼起来的),现在

    相关 二分查找-POJ 3122-Pie

    题目连接:[Pie][] 题目大意: 有N张饼,k个朋友,为了体面,必须把饼切割成大小一样的k+1块(包括主人自己),求出每个人能得到的最大饼体积。 前提:每人一