在一款开放世界的冒险游戏中,玩家扮演旅行者,探索各种不同风景的区域,与各种怪物战斗,并解决谜题和任务。游戏中的角色分为不同的元素属性,如火、水、雷等,每个角色都有独特的技能和元素反应能力。 玩家可以通过抽取角色来获取新的角色,每个角色都有自己的技能和武器类型。 现在问题是: 有n个不同职业的玩家,编号从1到n,地图上有m个不同的怪物,每个怪物都有一个属性值ai,表示克制该怪物的职业编号。 如果当前职业擅长克制当前怪物,则玩家只需花费1分钟即可消灭怪物;否则,需要花费2分钟。 每个玩家一次只能攻击一个怪物。 求对于所有的怪物,玩家们需要多长时间才能一起将它们全部消灭。 输入描述: 第一行是一个整数T,表示测试用例的数量。 每个测试用例包含两行: 第一行是两个整数n和m,表示玩家数量和怪物数量。 第二行是m个整数A1,A2,...,Am(1<=Ai<=n),表示克制第i个怪物的职业编号。 输出描述: 对于每个测试用例,输出一个整数,表示玩家们一起消灭所有怪物所需的最短时间。 示例1 输入 复制 4 2 4 1 2 1 2 2 4 1 1 1 1 5 5 5 1 3 2 4 1 1 1 输出 复制 2 3 1 1 用c++帮我解决这个问题
时间: 2024-03-25 12:41:38 浏览: 98
好的,这是一个典型的贪心算法问题。我们可以先将所有怪物按照属性值从小到大排序,然后依次派遣能够克制当前怪物的玩家进行攻击,直到所有怪物都被消灭为止。具体实现可以参考以下代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n >> m;
vector<int> a(m);
for (int i = 0; i < m; i++) {
cin >> a[i];
}
sort(a.begin(), a.end()); // 按属性值从小到大排序
vector<int> cnt(n + 1); // 统计每个职业的可用人数
int ans = 0;
for (int i = 0; i < m; i++) {
if (cnt[a[i]] > 0) { // 如果有可用的人,直接攻击
cnt[a[i]]--;
} else { // 否则需要等待2分钟
ans += 2;
}
cnt[0]++; // 每次攻击结束后,空闲的人数+1
}
cout << ans << endl;
}
return 0;
}
```
代码中,cnt[i] 表示第 i 个职业可用的人数,cnt[0] 表示当前空闲的人数。按照属性值从小到大排序后,依次扫描每个怪物,如果当前职业有可用的人,则直接攻击;否则等待2分钟并消耗一个空闲人数。每次攻击结束后,空闲人数+1。最终答案即为等待的总时间。
阅读全文