蓝桥云课:分巧克力(二分查找法)

复制代码
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
  // 请在此输入您的代码
  //代表巧克力的总个数,以及有k个人
  int n=0,k=0;
  cin>>n>>k;
  int h[n],w[n];
  for(int i=0;i<n;i++){
    cin>>h[i]>>w[i];
  }
  //找到最大的边,后续方便进行二分查找,找到符合要求最大的边
  //r代表正方形的边
  int r=0;
  for(int i=0;i<n;i++){ 
   r=max(r,max(h[i],w[i]));
  }
  int l=1,ans=0;
  while(l<=r){
    int mid=(l+r)/2;
    int sum=0;
    //找到中间值后,循环遍历每一个长方形,判断这个中间值是否超过了每个长方形的长和宽
    for(int i=0;i<n;i++){
      if(mid<=min(h[i],w[i])){
        sum+=(h[i]/mid)*(w[i]/mid);
      }
    }
    //尝试寻找更大的值
    if(sum>=k){
      ans=mid;
      l=mid+1;
    }
    else{
      r=mid-1;
    }
  }
  cout<<ans<<endl;
  return 0;
}

本题:是一个二分查找的题目,要选出符合要求的巧克力的最大的边长。

第一个问题:在定义h[n]和w[n]时。先定义了这两个数组,并且没有先输入n,这就导致了执行出错。

第二个问题:在代码中运用的max与min函数,没有事先引入头文件#include<algorithm>

第三个问题:在二分查找的过程中逻辑不太会写。

当找到1与r(边长最大值)的时候,我们要取中间值mid,然后遍历每个长方形,若mid不超过给出的长方形的长与宽,则可以将这个长方形总共可以产生的正方形数目加到总sum中,以此判断完所有的长方形可以产生的小正方形。接着用产生的正方形的总数量与总人数产生对比,若大于等于总人数的话再从mid右边找值(也就是找边长比mid还大的值),若小于总人数的话说明边长大了,就从mid左边找值(也就是找边长比mid还小的值)。

相关推荐
V搜xhliang02462 分钟前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
汉克老师17 分钟前
GESP2025年3月认证C++五级( 第三部分编程题(2、原根判断))
c++·算法·模运算·gesp5级·gesp五级·原根·分解质因数
winner888136 分钟前
从零吃透C++命名空间、std、#include、string、vector
java·开发语言·c++
数据皮皮侠38 分钟前
上市公司创新韧性数据(2000-2024)|顶刊同款 EIR 指数
大数据·人工智能·算法·智慧城市·制造
WL_Aurora41 分钟前
Python 算法基础篇之链表
python·算法·链表
科研前沿1 小时前
纯视觉无感解算 + 动态数字孪生:室内外无感定位技术全新升级
大数据·人工智能·算法·重构·空间计算
AI进化营-智能译站1 小时前
ROS2 C++开发系列07-高效构建机器人决策逻辑,运算符与控制流实战
开发语言·c++·ai·机器人
winner88811 小时前
C++ 命名空间、虚函数、抽象类、protected 权限全套通俗易懂精讲(附与 Java 对比)
java·开发语言·c++
不会编程的懒洋洋1 小时前
C# P/Invoke 基础
开发语言·c++·笔记·安全·机器学习·c#·p/invoke
代码中介商1 小时前
数据结构开篇:从问题到解决方案
数据结构