Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1062889
  • 博文数量: 77
  • 博客积分: 821
  • 博客等级: 军士长
  • 技术积分: 1905
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-23 16:17
个人简介

学校:上海交通大学软件工程 学历:硕士 行业:从事流媒体移动开发 QQ: 412595942 邮箱:yiikai1987910@gmail.com

文章分类

全部博文(77)

文章存档

2016年(4)

2015年(15)

2014年(16)

2013年(12)

2012年(21)

2011年(9)

分类: C/C++

2015-02-26 16:13:52

    二分搜说是很实用的一个搜素算法,但是它并不一定是只在搜索指定数值的时候才有用。
   proj NO.1064这道题就可以用二分搜索很好的解决。
   关键的思想在于,像在求解最大化或最小化的问题的时候,可以想办法把条件公式求出,然后对于满足条件的值在范围内进行二分搜索来获取最后的答案,而不是直接去求解答。
    这道题可以套取公式: 求满足每根绳子的长度/x 的总和 = 指定的分割绳子数的时候x的最大值。
    对于这个条件, 我们就可以在0-INF这个范围内进行2分搜索来寻找这样的值了
    
    直接上代码:
     

点击(此处)折叠或打开

  1. //二分搜索的应用思想
  2. // 套用公式: 定义上下界,搜索在范围内满足条件c(x)的x
  3. #include "stdafx.h"

  4. #define MAXN 4 //绳子的总数
  5. #define MAXCN 2 //切割出的总数

  6. float length[MAXN] = {8.02,7.43,4.57,5.39};
  7. int low = 0;
  8. int up = 10;

  9. bool C(int mid)
  10. {
  11.     int k = 0;
  12.     for (int i = 0; i < MAXN; i++)
  13.     {
  14.         k += length[i] / mid;
  15.     }
  16.     if (k == MAXCN)
  17.         return true;
  18.     else
  19.     {
  20.         if (k < MAXCN)
  21.             up = mid;
  22.         else
  23.             low += mid;
  24.     }
  25.     return false;
  26. }

  27. int _tmain(int argc, _TCHAR* argv[])
  28. {
  29.     while (1)
  30.     {
  31.         int mid = (up - low) / 2;
  32.         if (mid == 0)
  33.         {
  34.             printf("can't find such data\n");
  35.             return true;
  36.         }
  37.         if (C(mid))
  38.         {
  39.             printf("The max length of pices is %d\n",mid);
  40.             return true;
  41.         }
  42.     }
  43.     
  44.     return 0;
  45. }

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