《B4071 [GESP202412 五级] 武器强化》
题目背景
对应的选择、判断题:试题 - GESP 202412 C++ 五级 - 洛谷有题
题目描述
小杨有 n 种武器和 m 种强化材料。第 i 种强化材料会适配第 pi 种武器,小杨可以花费 ci 金币将该材料对应的适配武器修改为任意武器。
小杨最喜欢第 1 种武器,因此他希望适配该武器的强化材料种类数严格大于其他的武器,请你帮小杨计算为了满足该条件最少需要花费多少金币。
输入格式
第一行包含两个正整数 n,m,含义如题面所示。
之后 m 行,每行包含两个正整数 pi,ci,代表第 i 种强化材料的适配武器和修改花费。
输出格式
输出一个整数,代表能够使适配第 1 种武器的强化材料种类数严格大于其他的武器最少需要花费的金币。
输入输出样例
输入 #1复制
4 4 1 1 2 1 3 1 3 2
输出 #1复制
1
说明/提示
样例解释
花费 1,将第三种强化材料的适配武器由 3 改为 1。此时,武器 1 有 2 种强化材料适配,武器 2 和武器 3 都各有 1 种强化材料适配,满足适配第 1 种武器的强化材料种类数严格大于其他的武器。
数据范围
对于 100% 的数据,保证 1≤n,m≤1000,1≤pi≤n,1≤ci≤109。
| 子任务编号 | 得分占比 | n | m |
|---|---|---|---|
| 1 | 20% | ≤2 | ≤1000 |
| 2 | 20% | ≤1000 | ≤2 |
| 3 | 60% | ≤1000 | ≤1000 |
代码实现:
#include <bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> costs[1005]; int n, m; int main() { cin >> n >> m; for (int i = 1; i <= m; i++) { int p; ll c; cin >> p >> c; costs[p].push_back(c); } for (int i = 1; i <= n; i++) { sort(costs[i].begin(), costs[i].end()); } ll ans = LLONG_MAX; int init_cnt = costs[1].size(); for (int k = init_cnt; k <= m; k++) { ll total_cost = 0; int cur_cnt_1 = init_cnt; vector<ll> all_other_costs; for (int i = 2; i <= n; i++) { int need = max(0, (int)costs[i].size() - (k - 1)); for (int j = 0; j < need && j < costs[i].size(); j++) { total_cost += costs[i][j]; cur_cnt_1++; } for (int j = need; j < costs[i].size(); j++) { all_other_costs.push_back(costs[i][j]); } } if (cur_cnt_1 < k) { sort(all_other_costs.begin(), all_other_costs.end()); for (int i = 0; i < k - cur_cnt_1 && i < all_other_costs.size(); i++) { total_cost += all_other_costs[i]; } } ans = min(ans, total_cost); } cout << ans << endl; return 0; }