• 二分算法(蓝桥杯 C++ 题目 代码 注解)


    目录

    模板:

    题目一(分巧克力): 

    代码:

     题目二(M次方根):

    ​编辑代码: 

    题目三(跳石头):

    代码: 

     题目四(扫地机器人):

    代码:

    模板:

    1. while (low < high)//在递增序列中查找>=x的数中最小的一个
    2. {
    3. int mid = (low + high) / 2;
    4. if (a[mid] >= x)
    5. high = mid;
    6. else
    7. low = mid + 1;
    8. }
    9. while (low < high)//在递增序列中查找<=x的数中最大的一个
    10. {
    11. int mid = (low + high) / 2;
    12. if (a[mid] <= x)
    13. low = mid;
    14. else
    15. high = mid - 1;
    16. }

    题目一(分巧克力): 

    代码:

    1. #include
    2. using namespace std;
    3. int n,k,h[100010],w[100010];
    4. bool pd(int l)//分l边长的巧克力是否满足
    5. {
    6. int sum=0;
    7. for(int i=1;i<=n;i++)//判断可以分几块
    8. {
    9. sum+=(h[i]/l)*(w[i]/l);
    10. if(sum>=k)//满足分大于等于k个人,返回true
    11. return true;
    12. }
    13. return false;
    14. }
    15. int main()
    16. {
    17. cin>>n>>k;
    18. for(int i=1;i<=n;i++)
    19. cin>>h[i]>>w[i];
    20. int high=0;
    21. for(int i=1;i<=n;i++)//查找二分上界
    22. {
    23. high=max(high,h[i]);
    24. high=max(high,w[i]);
    25. }
    26. int low=1,mid=0;
    27. while(low//二分查找
    28. {
    29. mid=(low+high+1)/2;
    30. if(pd(mid))
    31. low=mid;
    32. else
    33. high=mid-1;
    34. }
    35. cout<
    36. }

     题目二(M次方根):


    代码: 

    1. #include
    2. #include
    3. using namespace std;
    4. double n,m,l,r,mid;
    5. double eps=1e-8;//因为计算保留七位小数,则每次加10负8次方
    6. bool pd(double a,double d)
    7. {
    8. double c=1;
    9. while(d>0)//c的d次方
    10. {
    11. c*=a;
    12. d--;
    13. }
    14. if(c>=n)
    15. return true;
    16. else
    17. return false;
    18. }
    19. int main()
    20. {
    21. cin>>n>>m;
    22. l=0,r=n;
    23. while(l+eps//二分查找
    24. {
    25. mid=(l+r)/2;
    26. if(pd(mid,m))
    27. r=mid;
    28. else
    29. l=mid;
    30. }
    31. cout<setprecision(7)<//输出七位小数
    32. }

    题目三(跳石头):

    代码: 

    1. #include
    2. using namespace std;
    3. int l, n, m, mid;
    4. int stone[500010];
    5. bool check(int d)//判断距离d是否合适
    6. {
    7. int num = 0, pos = 0;//num记录搬走的石头,pos当前站立的石头
    8. for (int i = 1; i <= n; i++)
    9. {
    10. if (stone[i] - pos < d)//第i块石头需要搬走
    11. num++;//搬走石头数加一
    12. else
    13. pos = stone[i];//否则,位置站到该位置
    14. }
    15. if (num <= m)
    16. return true;
    17. else
    18. return false;
    19. }
    20. int main()
    21. {
    22. cin >> l >> n >> m;
    23. for (int i = 1; i <= n; i++)
    24. cin >> stone[i];
    25. int low = 0, high = l, ans;
    26. while (low < high)//二分查找
    27. {
    28. mid = (low + high + 1) / 2;
    29. if (check(mid))
    30. {
    31. low = mid;
    32. ans = mid;
    33. }
    34. else
    35. high = mid - 1;
    36. }
    37. cout << ans;
    38. }

     题目四(扫地机器人):

    代码:

    1. #include
    2. #include
    3. using namespace std;
    4. int pos[1000010];
    5. int n, k,mid;
    6. bool check(int len)//每个机器扫len个区域
    7. {
    8. int tmp = 0;//表示扫到的位置
    9. for (int i = 1; i <= k; i++)
    10. {
    11. if (pos[i] - len <= tmp)//如果当前机器人扫它的左边是比其它机器人省时间的,所以如果能够清扫完左边还没扫的,说明方案有可能可行
    12. {
    13. if (pos[i] <= tmp)//如果当前机器人已经处于扫过的位置,则机器人只扫右侧区域
    14. tmp = pos[i] + len - 1;
    15. else//否则从上一次扫到的位置开始扫
    16. tmp += len;
    17. }
    18. else
    19. return 0;//方案不可行
    20. }
    21. return tmp >= n;//全部扫完,方案可行
    22. }
    23. int main()
    24. {
    25. cin >> n >> k;
    26. for (int i = 1; i <= k; i++)
    27. cin >> pos[i];
    28. sort(pos + 1, pos + k + 1);//机器人位置从小到大排序
    29. int l = 0, r = n, ans;
    30. while (l <= r)//二分查找,每个机器人扫的距离,最小0,最大n
    31. {
    32. mid = (l + r) / 2;
    33. if (check(mid))
    34. {
    35. r = mid - 1;
    36. ans = mid;//记录最小的答案
    37. }
    38. else
    39. l = mid + 1;
    40. }
    41. cout << (ans - 1) * 2 << endl;//时间来回乘2
    42. }

  • 相关阅读:
    AtCoder Beginner Contest 345 A - E 题解
    雷电4模拟器安装xposed框架(2022年)
    docker报错Error response from daemon: Container xxx is not running
    小程序赖加载刷新数据页面数据堆叠问题debug
    《java开发高频面经总结大合集》你想要的都在这里了
    vue中data属性为什么是一个函数?
    Java基础 --- 线程状态 Thread States
    435-C++基础语法(61-70)
    Docker 安装运行命令解读安装Mysql
    Linux基础——ELK Stack
  • 原文地址:https://blog.csdn.net/qq_74156152/article/details/136585311