• 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
    ",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
    ",l * pi * l);
    64     }
    65 
    66     return 0;
    67 }
  • 相关阅读:
    算法笔记--数据结构--并查集
    帮助
    八数码难题神奇!!!
    题解 P1197 【[JSOI2008]星球大战】
    线段树1对于Pushdown的理解
    最短路问题之SPFA
    并查集(路径压缩)
    并查集(KRUSKAL算法)
    初识单调栈
    初识单调队列
  • 原文地址:https://www.cnblogs.com/kickit/p/7609421.html
Copyright © 2020-2023  润新知