首页 > 其他分享 >【贪心】【堆】tokitsukaze and Soldier

【贪心】【堆】tokitsukaze and Soldier

时间:2024-10-20 21:22:02浏览次数:1  
标签:temp power Soldier 战斗力 tokitsukaze 士兵 战力 total 贪心

https://ac.nowcoder.com/acm/contest/22904/1004

1. 为什么要排序?

排序是为了先处理人数限制大的士兵。因为人数限制小的士兵会影响后续的选择,优先处理人数限制大的士兵可以让我们选出更多的士兵,最大化战斗力。

  • 如果不排序,可能会先处理人数限制小的士兵,导致过早地剔除高战斗力的士兵。
  • 排序后,我们可以尽可能多地选士兵,在人数限制大的情况下挑选出战斗力较大的组合,后面再根据限制逐渐减少人数。

2. 为什么要用 max(temp, total_power)

max(temp, total_power) 是为了更新最大战斗力总和

  • temp 是当前选定士兵的总战斗力,但由于人数限制的原因,某些时刻的总战斗力会减小。
  • total_power 保存的是之前计算过的最大战斗力,我们需要不断比较当前战斗力 temp 和之前的最大值 total_power,这样才能确保输出的最终结果是所有可能情况中的最大值。

这一步是为了确保即便在处理人数限制时总战斗力降低,也不会错过之前的最佳组合。

#include <bits/stdc++.h>
using namespace std;

bool compare(pair<int, int>a, pair<int, int> b) {
    return a.first > b.first;
}
int main() {
    int n;
    cin >> n;

    vector<pair<int, int>> soldiers(n);
    for (int i = 0; i < n; i++) {
        int v, s;
        cin >> v >> s;
        soldiers[i] = {s, v}; // s表示人数限制,v表示战力
    }

    // 按照人数限制 s 从大到小排序
    sort(soldiers.begin(), soldiers.end(), compare);

    priority_queue<int, vector<int>, greater<int>> pq; // 小根堆,用于存储已选士兵的战力
    long long total_power = 0; // 团的总战力
    long long temp = 0;
    for (auto [s, v] : soldiers) {
        pq.push(v);          // 将当前士兵的战力加入堆中
        temp += v;    // 增加总战力

        // 如果人数超过了当前士兵的限制,就移除战力最小的士兵
        while(pq.size() > s) {
            temp -= pq.top(); // 移除最小战力
            pq.pop();
        }
        total_power = max(temp, total_power);
    }

    cout << total_power << endl; // 输出最大战力
    return 0;
}

标签:temp,power,Soldier,战斗力,tokitsukaze,士兵,战力,total,贪心
From: https://www.cnblogs.com/peterzh/p/18487929

相关文章

  • C++编程-贪心算法2
    目录先言例题三:删数问题(NOI1994)题目描述算法分析标准程序-字符串String例题四:拦截导弹问题题目描述算法分析主要框架(标准程序)例题五:活动选择题目描述算法分析标准程序先言今天讲贪心算法的第3~5例题例题三:删数问题(NOI1994)题目描述【题目描述】输......
  • 【C++贪心】2086. 喂食仓鼠的最小食物桶数|1622
    本文涉及知识点C++贪心LeetCode2086.喂食仓鼠的最小食物桶数给你一个下标从0开始的字符串hamsters,其中hamsters[i]要么是:‘H’表示有一个仓鼠在下标i,或者’.’表示下标i是空的。你将要在空的位置上添加一定数量的食物桶来喂养仓鼠。如果仓鼠的左边或右边......
  • LeetCode热题100|买卖股票的最佳时机(贪心)
    简述题意省流版:在一个序列里找到max(a[i]-a[k])且i>k。解题思路:  遍历这个序列,i表示当前遍历到了第i个元素,min1表示1到i这个范围内最小的元素,max1表示1到i这个范围内最大的【max(a[i]-a[k])】。max1=max(max1,第i个元素的值-min1)代码如下:classSolution{public:intm......
  • 【贪心算法】(第四篇)
    目录最⻓连续递增序列(easy)题目解析讲解算法原理编写代码买卖股票的最佳时机(easy)题目解析讲解算法原理编写代码最⻓连续递增序列(easy)题目解析1.题目链接:.-力扣(LeetCode)2.题目描述给定⼀个未经排序的整数数组,找到最⻓且连续递增的⼦序列,并返回该序列的⻓度。......
  • 【贪心算法】(第三篇)
    目录最⻓递增⼦序列(medium)题目解析讲解算法原理编写代码递增的三元⼦序列(medium)题目解析讲解算法原理编写代码最⻓递增⼦序列(medium)题目解析1.题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/description/2.题目描述给你⼀个整数数组......
  • 贪心算法
    贪心算法基本要素1.贪心选择性质:通过每个子问题的最优选择,可以得到整个问题的最优解。意味着,当我们面对一个问题时,我们就可以通过贪心策略来做出局部最优的选择,最终得到全局最优的解。2.最优子结构:问题的最优解包含子问题的最优解。意味着,问题可以分解成若干个子问题,每个子问......
  • 贪心算法
    贪心算法基本要素1.贪心选择性质:通过每个子问题的最优选择,可以得到整个问题的最优解。意味着,当我们面对一个问题时,我们就可以通过贪心策略来做出局部最优的选择,最终得到全局最优的解。2.最优子结构:问题的最优解包含子问题的最优解。意味着,问题可以分解成若干个子问题,每个子问......
  • 贪心算法
    贪心算法 贪心算法基本要素1.贪心选择性质:通过每个子问题的最优选择,可以得到整个问题的最优解。意味着,当我们面对一个问题时,我们就可以通过贪心策略来做出局部最优的选择,最终得到全局最优的解。2.最优子结构:问题的最优解包含子问题的最优解。意味着,问题可以分解成若干个......
  • LeetCode刷题日记之贪心算法(二)
    目录前言买卖股票的最佳时机II跳跃游戏跳跃游戏II总结前言在上一篇贪心算法的学习中,我们探讨了贪心算法的基本思路和逻辑框架。在这篇文章中,我将继续分享几道经典的LeetCode贪心算法题,并探讨其背后的解题思路和技巧。希望通过这些题目的实践,能加深我对贪心算法的理......
  • 【贪心算法】(第二篇)
    目录最⼤数(medium)题目解析讲解算法原理编写代码摆动序列(medium)题目解析讲解算法原理编写代码最⼤数(medium)题目解析1.题目链接:.-力扣(LeetCode)2.题目描述给定⼀组⾮负整数nums,重新排列每个数的顺序(每个数不可拆分)使之组成⼀个最⼤的整数。注意:输出结果可能......