Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7360
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 52
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-07 20:52
个人简介

一条狗

文章分类

全部博文(4)

分类: C/C++

2015-05-10 01:00:27


    原题链接:
    题      意:(F+1)个人分享烙饼,要保证每个人(共N个人)分得的体积是一样的,每分得的一块要么是原本就存在的一整块,要么就是由原来交大的分割而来,不能是由两块或两块以上的饼拼凑而来。试求每个人能分得的最大的烙饼的体积。
    方      法:二分法
    分      析:①首先可知每个人能获得的饼的最小体积和最大体积分别是:0,MAX(pie[0], pie[1],......pie[n-1]),在保证每块饼都不是拼凑而来的情况下,能获得的饼的体积的单调不连续递增的;
                ②令 left = 0, right = max, middle = (left + right)/2;    //left right middle 均为饼的体积
                ③函数 test() 的作用是测试当前所得饼的体积(middle)是否已是能分割的极限,看更大体积的饼是否能被分割出来。
    代      码:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<math.h>

  3. #define PI    acos(-1.0)

  4. double pie[10008];

  5. int test(double x, int n, int f)
  6. {
  7.     int sum = 0;

  8.     for(int i = 0; i < n; i++)
  9.     {
  10.         sum += (int)(pie[i] / x);
  11.     }

  12.     if(sum >= f + 1)        //还能在分
  13.     {
  14.         return 1;
  15.     }
  16.     else
  17.     {
  18.         return 0;
  19.     }
  20. }

  21. int main(void)
  22. {
  23.     int t;
  24.     int n, f;
  25.     
  26.     double l, r, m;

  27.     double max;

  28.     scanf("%d", &t);
  29.     while(t--)
  30.     {
  31.         max = 0;
  32.         scanf("%d%d", &n, &f);
  33.         for(int i = 0; i < n; i++)
  34.         {
  35.             scanf("%lf", pie + i);
  36.             pie[i] = pie[i] * pie[i] * PI;

  37.             max = max > pie[i] ? max : pie[i];
  38.         }

  39.         l = 0;
  40.         r = max;
  41.         m = (l + r) / 2.0;

  42.         while(l - r < -1e-6)
  43.         {
  44.             if(test(m, n, f))                //还可再分
  45.             {
  46.                 l = m;    
  47.             }
  48.             else
  49.             {
  50.                 r = m;
  51.             }

  52.             m = (l + r) / 2.0;
  53.         }

  54.         printf("%.4lf\n", m);
  55.     }

  56.     return 0;
  57. }

AC要注意的几个问题:① π = acos(-1.0) 是比较精确的
                        ② l - r < -1e-6 注意精度



阅读(863) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~