当前位置: 首页 > news >正文

【算法提升】分组 day_tow

1.分组

在这里插入图片描述

1.1 解析

个人认为这题最难的点在于如何想到使用二分的算法来解题。 正向求解:就是去看每一组中需要分多少个人,但是这样求解代码我根本写不出来。
所以根据正难则反的思想,我们可以从最终结果去倒推。 枚举最终的分配结果中,最多的人数(设为x)

在这里插入图片描述

如果你对二分非常熟悉,你就很敏锐的发现这题可以使用二分来求解 当然需要确定左右边界
左边界最小就是1,右边界就是所有声部的种类中,人数最多的那个数量 当然上图的a,b,c这些人数需要使用hash表来存储。

1.2细节问题

大致的逻辑说完之后,我们就要看一些细节问题,如果声部的种类大于要分的组数,那这是无法分成的,所以需要特判一下。

然后就是二分的细节,注意这里是求最小,所以二分时要注意写法,

多提一嘴如何判断 == 的情况,比如这个当sum == m的时候还可能有更优的解法sum<=m所以这里只处理大于的情况

希望看到这里你能自己动手去写一下代码,代码能力也是非常重要的一部分!

1.3代码

#include<iostream>
#include<unordered_map>
#include<vector>
#include<cmath>using namespace std;
int main()
{//1.输入int n=0,m=0;cin>>n>>m;vector<int> nums(n);for(int i=0;i<n;i++)cin>>nums[i];//2.输出//思路枚举+二分,枚举出最终的分配结果中最多的人数,unordered_map<int,int> hash;//统计出相同声部的人的个数for(auto x:nums)hash[x]++;//特判if(hash.size()>m){cout<<-1<<endl;return 0;}//1.left最小为1,right右边界为hash表中的最大人数int max_right=0;for(auto& [a,b]:hash){max_right=max(max_right,b);}int left=0,right=max_right;while(left<right){int mid=left+(right-left)/2;int sum=0;//统计出当最多人数为mid时的组数for(auto& [a,b]:hash){sum+=(b/mid+(b%mid==0 ? 0 :1));if(sum>m)    break;}//多提一嘴如何判断==的情况,比如这个当sum==m的时候还可能有更优的解法sum<=m所以这里只处理大于的情况if(sum>m)//组分太多,说明最多人数太少了 left=mid+1;elseright=mid;}cout<<left<<endl;return 0;
}

相关文章:

  • 【Doris基础】Apache Doris业务场景全解析:从实时数仓到OLAP分析的完美选择
  • ECS-7000能耗监测系统能耗数据管理机
  • iEKF的二维应用实例
  • 产品更新|数字主线深度解析:华望解决方案助力企业数字化转型
  • RabbitMQ和MQTT区别与应用
  • 粽叶飘香时 山水有相逢
  • 【动手学深度学习】2.5. 自动微分
  • 北京大学肖臻老师《区块链技术与应用》公开课:06-BTC-网络
  • PSpice软件快速入门系列--07.如何进行Worst Case最坏情况分析
  • TypeScript 中感叹号(!)两种位置用法
  • 基于粒子滤波的PSK信号解调实现
  • C#上传图片后压缩
  • Java处理动态的属性:字段不固定、需要动态扩展的 JSON 数据结构
  • FastAPI 项目配置管理
  • C/C++ 面试复习笔记(2)
  • << C程序设计语言第2版 >> 练习 1-23 删除C语言程序中所有的注释语句
  • 高级数据结构与算法期末考试速成记录
  • 6个月Python学习计划 Day 9 - 函数进阶用法
  • ros2工程在普通用户下正常编译但root下编译无法成功也不会自动停止
  • 历年南开大学计算机保研上机真题
  • 网站关键词怎么布局/网站建设苏州
  • 怎么做网站编程/济南百度公司
  • 山东网站seo公司/网站百度百科
  • 四川网站建设那家好/windows优化大师官方
  • 日照网站建设哪家公司好/策划书模板
  • 乌鲁木齐做网站的/买外链网站