链接:https://ac.nowcoder.com/acm/contest/59840/G 来源:牛客网 题目描述 在一款开放世界的冒险游戏中,玩家扮演旅行者,探索各种不同风景的区域,与各种怪物战斗,并解决谜题和任务。游戏中的角色分为不同的元素属性,如火、水、雷等,每个角色都有独特的技能和元素反应能力。 玩家可以通过抽取角色来获取新的角色,每个角色都有自己的技能和武器类型。 现在问题是: 有n个不同职业的玩家,编号从1到n,地图上有m个不同的怪物,每个怪物都有一个属性值ai,表示克制该怪物的职业编号。 如果当前职业擅长克制当前怪物,则玩家只需花费1分钟即可消灭怪物;否则,需要花费2分钟。 每个玩家一次只能攻击一个怪物。 求对于所有的怪物,玩家们需要多长时间才能一起将它们全部消灭。 输入描述: 第一行是一个整数T,表示测试用例的数量。 每个测试用例包含两行: 第一行是两个整数n和m,表示玩家数量和怪物数量。 第二行是m个整数A1,A2,...,Am(1<=Ai<=n),表示克制第i个怪物的职业编号。 输出描述: 对于每个测试用例,输出一个整数,表示玩家们一起消灭所有怪物所需的最短时间。
时间: 2024-03-30 09:36:04 浏览: 103
下面是一个C++的实现代码,使用了优先队列(堆)来维护每个职业的数量:
```c++
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N = 100010;
int n, m;
int a[N], cnt[N], p[N];
int main()
{
int T;
cin >> T;
while (T--)
{
cin >> n >> m;
memset(cnt, 0, sizeof(cnt));
for (int i = 1; i <= m; i++)
{
cin >> a[i];
cnt[a[i]]++;
}
priority_queue<pair<int, int>> q;
for (int i = 1; i <= n; i++)
q.push(make_pair(cnt[i], i));
int ans = 0;
for (int i = m; i >= 1; i--)
{
int x = a[i];
if (cnt[x] > q.top().first)
{
ans += 2;
int y = q.top().second;
q.pop();
cnt[y]--;
q.push(make_pair(cnt[y], y));
}
else
{
ans++;
}
cnt[x]--;
q.pop();
q.push(make_pair(cnt[x], x));
}
cout << ans << endl;
}
return 0;
}
```
注意,由于需要从后往前攻击怪物,所以在代码中使用了倒序遍历的方式。
阅读全文