算法-贪心-XMUOJ圣遗物的强化

题目

思路

贪心 - OI Wiki (oi-wiki.org)

贪心算法(greedy algorithm,又称贪婪算法)详解(附例题)-CSDN博客

代码

Python暴力排序

def min_mora_cost(n, levels):
    levels.sort()  # 对圣遗物等级进行升序排序
    total_cost = 0  # 初始化总摩拉消耗数为0
    
    # 进行强化操作直到只剩下一件超级圣遗物为止
    while len(levels) > 1:
        # 选择等级最低的两件圣遗物进行强化
        current_cost = levels[0] + levels[1]
        total_cost += current_cost
        
        # 合成新的圣遗物,将其等级加入到原有的圣遗物集合中
        levels = levels[2:] + [current_cost]
        levels.sort()  # 重新排序圣遗物等级列表
    
    return total_cost

# 读取输入
n = int(input())
levels = list(map(int, input().split()))

# 输出最小的摩拉消耗值
print(min_mora_cost(n, levels))

C++暴力贪心 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> relics(n);
    for (int i = 0; i < n; ++i) {
        cin >> relics[i];
    }

    // 对圣遗物的等级进行排序
    sort(relics.begin(), relics.end());

    int total_cost = 0;
    while (relics.size() > 1) {
        // 选择最小等级的两个圣遗物进行强化
        int cost = relics[0] + relics[1];
        total_cost += cost;

        // 将新的圣遗物加入列表,并重新排序
        relics.push_back(cost);
        sort(relics.begin() + 2, relics.end());

        // 移除已经强化的两个圣遗物
        relics.erase(relics.begin(), relics.begin() + 2);
    }

    cout << total_cost << endl;

    return 0;
}

C++优先队列

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main() {
    int n;
    cin >> n;

    // 读取圣遗物的等级,同时构建优先队列
    priority_queue<int, vector<int>, greater<int>> pq;
    for (int i = 0; i < n; ++i) {
        int level;
        cin >> level;
        pq.push(level);
    }

    int total_cost = 0;
    // 当优先队列中至少有两个元素时,不断取出两个最小等级的圣遗物进行强化
    while (pq.size() >= 2) {
        // 取出队首的两个最小等级的圣遗物
        int relic1 = pq.top();
        pq.pop();
        int relic2 = pq.top();
        pq.pop();

        // 计算强化的摩拉消耗,并将新的圣遗物加入到队列中
        int cost = relic1 + relic2;
        total_cost += cost;
        pq.push(cost);
    }

    cout << total_cost << endl;

    return 0;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值