leetcode1552.两球之间的磁力

题目链接

算法

二分+贪心

时间复杂度O(nlogn + nlogm)

1.根据题意描述,我们需要将m个球放入到n个篮子中,根据题目中数据范围描述发现m <= n,故可以将一个球放入到一个篮子中。这道题主要就是要求出相邻的两个球之间的距离的最小值,而且要尽可能的让这个最小值最大化

2.分析完了题意,下面来分析一下如何解题。刚开始的思路是首先排序,然后将第一个球放到数组的第一个位置,然后根据剩余的球的个数枚举球的位置。但因为还需要记录相邻两个球的距离差,如果这样纯暴力的话写起来太过于繁琐,并且耗时大,最终该思路未果。在搜索了大佬们的解题思路后,了解到可以使用二分思想来对磁力进行二分,具体思路如下。

3.对于一些球,它们之间磁力的最大值是poisiton数组中元素的最大值减去最小值(这里先不考虑球的个数),那么我们就可以确定了磁力的区间范围[l,r],然后将[l,r]划分为[l,mid-1][mid,r],为什么要这样划分呢,因为题目中说了要最大化最小磁力,所以我们要尽可能的使得mid更大。划分条件就是判断position数组是否能够找到m个篮子使得它能够满足相邻的两个球之间的距离大于等于mid,如果满足,则l=mid,否则r=mid-1

4.为了使得最小磁力最大化,我们可以使其中一个球位于最左边的那个篮子里,然后再以此枚举球的位置,使得相邻的两个球的距离大于等于mid。

5.由此,这道题的总体思路是:先排序,然后二分。

C++代码

  1. class Solution {
  2. public:
  3. int maxDistance(vector<int>& position, int m) {
  4. sort(position.begin(), position.end());
  5. int len = position.size();
  6. int l = 1, r = position[len - 1] - position[0];
  7. while(l < r){
  8. int mid = l + r + 1>> 1;
  9. if(check(mid, position, m))
  10. l = mid;
  11. else
  12. r = mid - 1;
  13. }
  14. return l;
  15. }
  16. bool check(int k, vector<int>& position, int m){
  17. int len = position.size();
  18. int last = position[0]; //last用于记录上一个存放球的篮子的位置
  19. int t = 1; //记录已经放入到篮子的球的个数
  20. for(int i = 1; i < len; i++){
  21. if(position[i] - last >= k){
  22. ++t;
  23. last = position[i];
  24. if(t == m) return true;
  25. }
  26. }
  27. return false;
  28. }
  29. };

这道题使用的二分模板来源于yxc大佬的二分查找算法模板

leetcode1552题解【二分+贪心】的更多相关文章

  1. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

  2. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  3. Codeforces_732D_(二分贪心)

    D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  4. NOIP 2012 疫情控制(二分+贪心+倍增)

    题解 二分时间 然后一个显然的事是一个军队向上爬的越高它控制的点越多 所以首先军队尽量往上爬. 当一个军队可以爬到根节点我们记录下它的剩余时间T和它到达根结点时经过的根节点的子节点son. 当一个军队 ...

  5. CF732D Exams 二分 贪心

    思路:二分+贪心 提交次数:10次以上 错因:刚开始以为二分(边界,$+1or-1$)写错了,调了半天,后来才发现是$ck()$写错了.开始只判了最后是否小于零,而应该中间一旦小于零就$return\ ...

  6. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

  7. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  8. $CF949D\ Curfew$ 二分/贪心

    正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...

  9. $bzoj2067\ szn$ 二分+贪心

    正解:二分+贪心 解题报告: 传送门$QwQ$ 题目大意就说有一棵树,然后要用若干条线覆盖所有边且不能重叠.问最少要用几条线,在用线最少的前提下最长的线最短是多长. 昂首先最少用多少条线这个还是蛮$e ...

随机推荐

  1. 文章目录&友情链接

    文章目录&友情链接 1:<公告:本博客开始写博文了> 2.本人网络图书馆

  2. golang 判断前缀后缀、包含关系

    HasPrefix 判断字符串 s 是否以 prefix 开头:strings.HasPrefix(s, prefix string) bool HasSuffix 判断字符串 s 是否以 suffi ...

  3. 2020.5.23 第三篇 Scrum冲刺博客

    Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3.2 主要代码截图 3.3 程序运行截图 ...

  4. 区块链入门到实战(20)之以太坊(Ethereum) – 虚拟机(E.V.M.)

    作用:执行智能合约代码的引擎 以太坊(Ethereum)虚拟机是执行智能合约代码的引擎. 可以用某种语言,例如Solidity语言,开发智能合约程序,编译成以太坊(Ethereum)虚拟机支持的字节码 ...

  5. OI常用数学定理&方法总结

    组合数计算($O(n)$) https://www.cnblogs.com/linzhuohang/p/11548813.html Lucas定理 如果要计算很大的组合数,但模数较小,考虑这个方法 对 ...

  6. 使用 K8s 进行作业调度实战分享

    最近在公司的数据同步项目(以下简称 ZDTP)中,需要使用到分布式调度数据同步执行单元,目前使用的方案是将数据同步执行单元打包成镜像,使用 K8s 进行调度. 在 ZDTP 中,数据同步的动作可抽象成 ...

  7. 面经手册 · 第7篇《ArrayList也这么多知识?一个指定位置插入就把谢飞机面晕了!》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 数据结构是写好代码的基础! 说到数据结构基本包括:数组.链表.队列.红黑树等,但当你 ...

  8. 漏洞重温之sql注入(五)

    漏洞重温之sql注入(五) sqli-labs通关之旅 填坑来了! Less-17 首先,17关,我们先查看一下页面,发现网页正中间是一个登录框. 显然,该关卡的注入应该为post型. 直接查看源码. ...

  9. Ubuntu安装Windows官方版QQ和微信(使用deepin wine)

  10. Java开发之javaEE(java2EE)的介绍,java软件工程师初步阶段知识

    1. 为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担. 为了程序 ...