测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A29867. 武器强化

填空题 困难

题目描述

武器强化

时间限制:2.0 s    内存限制:512.0 MB

题目描述

小杨有n种武器和m种强化材料。第 i 种强化材料会适配第pi种武器,小杨可以花费ci金币将该材料对应的适配武器修改为任意武器。

小杨最喜欢第1种武器,因此他希望适配该武器的强化材料种类数严格大于其他的武器,请你帮小杨计算为了满足该条件最少需要花费多少金币。

输入格式

第一行包含两个正整数n,m,含义如题目所示。

之后m行,每行包含两个正整数pi,ci ,代表第 i 种强化材料的适配武器和修改花费。

输出格式

输出一个整数,代表能够使适配第1种武器的强化材料种类数严格大于其他的武器最少需要花费的金币。

输入样例

4 4

1 1

2 1

3 1

3 2

输出样例

1

样例解释

花费1,将第三种强化材料的适配武器由3改为1。此时,武器1有2种强化材料适配,武器2和武器3都各有1种强化材料适配。满足适配第1种武器的强化材料种类数严格大于其他的武器。

参考答案

#include<bits/stdc++.h> using namespace std; #define ll long long int n, m; int cnt[1010]; vector<int> cs[1010]; ll calc(int aim) { int cur_cnt = cnt[1]; ll res = 0; vector<int> tmp; for (int i = 2; i<=n; i++) { int buy = max((int)cs[i].size() - aim + 1, 0); for (int j = 0; j < buy; ++j) { res += (ll)cs[i][j]; } cur_cnt += buy; for (int j = buy; j < cs[i].size(); ++j) { tmp.push_back(cs[i][j]); } } sort(tmp.begin(), tmp.end()); for (int i = 0; i < aim - cur_cnt; i++) { res += (ll)tmp[i]; } return res; } signed main() { // freopen("06.in", "r", stdin); cin >> n >> m; for (int i = 1; i <=m; i++) { int p, c; cin >> p >> c; cnt[p]++; cs[p].push_back(c); } for (int i = 1; i <=n; i++) { sort(cs[i].begin(), cs[i].end()); } ll ans = 1e18; for (int i = max(cnt[1], 1); i <= m; ++i) { ans = min(ans, calc(i)); } cout << ans << "\n"; }
上一题 下一题