• 【力扣每日一题】2023.9.3 消灭怪物的最大数量


    目录

    题目:

    示例:

    分析:

    代码:


    题目:

    示例:

    分析:

    题目比较长,我概括一下就是有一群怪物,每只怪物离城市的距离都不一样,并且靠近的速度也不一样,每次我们可以消灭一只,当怪物到达城市的时候我们就失败了,问我们最终可以消灭多少只怪物。

    我的第一想法是直接模拟,不过做了一点小优化。我们每次都先将怪物的距离减去速度表示它们移动了,每次有到达城市的怪物(也就是距离城市小于等于0的)我们就记录下数量。最终我们比较一下到达城市的怪物和已经经过的轮数谁更大,这时候轮数就等于我们击杀的怪物数量,因为一轮只能杀一只怪物。如果达到城市的怪物数量大于我们击杀的数量,那么结束,我们返回击杀数即可。

    我一开始觉得这么做应该勉强能过,因为对vector进行删除元素的操作很费时间,而这么操作不需要对数组进行删除元素的操作,虽然也是暴力模拟,但也不是单纯的模拟,不过结果还是超时了,我们就需要另外想一个办法。

    我们先想想我们每轮需要击杀的怪物是哪一只,是离城市最近的吗?不是,就算一个怪物离城市很近,但是它的速度比较慢,那也是对我们暂时没有威胁的。

    我们优先消灭的怪物是最快到达的怪物,所以我们可以把每个怪物到达城市所需花费的时间算出来,接着对花费时间从小到大升序排序,优先消灭靠前的怪物,不过我们并不需要知道具体是哪一只怪物,所以可以直接对存放花费时间的数组进行排序。

    直接遍历排序后的数组,如果第 i 个元素小于等于 i ,那么就表示会有怪物在我们击杀它之前到达城市,这时候返回 i ,也就是轮数,同时也是等于我们击杀的怪物数量。

    代码:

    1. class Solution {
    2. public:
    3. int eliminateMaximum(vector<int>& dist, vector<int>& speed) {
    4. //超时
    5. int res=0;
    6. while(ressize()){
    7. int num=0;
    8. for(int i=0;isize();i++){
    9. dist[i]-=speed[i]; //预先让怪物先移动
    10. if(dist[i]<=0) num++; //如果怪物距离小于等于0则表示到达城市,记录数量
    11. }
    12. res++; //每轮至少可以击杀一个怪兽
    13. if(num>res) break; //如果到达城市的怪物大于我们击杀的怪兽数,退出循环
    14. }
    15. return res;
    16. int n=dist.size();
    17. vector<int>cache(n);
    18. for(int i=0;i//提前计算出每只怪物到达城市需要多久
    19. cache[i]=dist[i]/speed[i]+(dist[i]%speed[i]!=0);
    20. }
    21. //按照到达的先后顺序升序排序
    22. sort(cache.begin(),cache.end());
    23. for(int i=0;i
    24. //如果有怪物达到的时间小于等于当前轮数,那么返回当前轮数
    25. if(cache[i]<=i) return i;
    26. }
    27. return n;
    28. }
    29. };

  • 相关阅读:
    【K8S系列】深入解析k8s 网络插件—Antrea
    神经网络在通信中的应用,神经网络技术及其应用
    什么是适应能力?如何提高适应能力?
    多旋翼集群的分散时空轨迹规划
    【JavaScript】写程序编程基础入门
    UE5、CesiumForUnreal实现加载GeoJson绘制盒体(Box)功能(StaticMesh方式)
    Java Double equals()方法具有什么功能呢?
    记一次 .NET 某金融企业 WPF 程序卡死分析
    代码随想录训练营第39天|LeetCode 62.不同路径、63. 不同路径 II
    Linux OpenLDAP配置ACL
  • 原文地址:https://blog.csdn.net/m0_63235356/article/details/132645698