卡牌cardcpp时间限制:1s 空间限制:512 MB【问题描述】一副牌有 n 张卡牌每张卡牌都有其威力。卡牌有两种类型:·英雄卡该卡的能量值始终等于0;·能量卡这种卡的能量值总是正整数。您可以使用该套牌执行以下操作:·从牌堆顶取出一张牌;·如果这张卡是能量卡你可以将其置于你的卡组顶部或丢弃;·如果这张卡是英雄卡则该英雄卡将获得你的卡组顶部的能量卡所拥有的能量值如果卡组不为空之后该英雄被添加到你
【解题思路】 这道题可以使用贪心算法来解决。
我们首先将所有能量卡按照从大到小的顺序排列。然后从牌堆顶开始遍历,如果遇到英雄卡,则将其添加到军队中,同时将能量卡从能量卡数组中删除。如果遇到能量卡,则将其添加到能量卡数组中。
最后,我们将能量卡数组中的能量值加起来即为所求的最大可能总能量值。
【算法步骤】
- 读入n和牌堆的序列。
- 定义一个数组energy_cards来存储能量卡,初始化为空。
- 遍历牌堆的序列,如果当前牌是英雄卡,则将其添加到军队中,同时将能量卡数组中的所有能量值加到当前英雄卡上;如果当前牌是能量卡,则将其添加到能量卡数组中。
- 计算能量卡数组中的能量值之和,输出结果。
【算法复杂度】 该算法时间复杂度为O(nlogn),空间复杂度为O(n)。
【源码】
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> pile(n);
for (int i = 0; i < n; i++) {
cin >> pile[i];
}
vector<int> energy_cards;
long long total_energy = 0;
for (int i = 0; i < n; i++) {
if (pile[i] == 0) {
if (!energy_cards.empty()) {
int energy = energy_cards.back();
energy_cards.pop_back();
total_energy += energy;
}
} else {
energy_cards.push_back(pile[i]);
sort(energy_cards.begin(), energy_cards.end(), greater<int>());
}
}
cout << total_energy << endl;
return 0;
}
``
原文地址: http://www.cveoy.top/t/topic/iGea 著作权归作者所有。请勿转载和采集!