洛谷 B4071 [GESP202412 五级] 武器强化-普及/提高-
·
题目描述
小杨有 nnn 种武器和 mmm 种强化材料。第 iii 种强化材料会适配第 pip_ipi 种武器,小杨可以花费 cic_ici 金币将该材料对应的适配武器修改为任意武器。
小杨最喜欢第 111 种武器,因此他希望适配该武器的强化材料种类数严格大于其他的武器,请你帮小杨计算为了满足该条件最少需要花费多少金币。
输入格式
第一行包含两个正整数 n,mn,mn,m,含义如题面所示。
之后 mmm 行,每行包含两个正整数 pi,cip_i,c_ipi,ci,代表第 $i $ 种强化材料的适配武器和修改花费。
输出格式
输出一个整数,代表能够使适配第 111 种武器的强化材料种类数严格大于其他的武器最少需要花费的金币。
输入输出样例 #1
输入 #1
4 4
1 1
2 1
3 1
3 2
输出 #1
1
说明/提示
样例解释
花费 111,将第三种强化材料的适配武器由 333 改为 111。此时,武器 111 有 222 种强化材料适配,武器 222 和武器 333 都各有 111 种强化材料适配,满足适配第 111 种武器的强化材料种类数严格大于其他的武器。
数据范围
对于 100%100\%100% 的数据,保证 1≤n,m≤1 0001\le n,m\le 1\, 0001≤n,m≤1000,1≤pi≤n1\le p_i\le n1≤pi≤n,1≤ci≤1091\le c_i\le 10^91≤ci≤109。
| 子任务编号 | 得分占比 | nnn | mmm |
|---|---|---|---|
| 111 | 20%20\%20% | ≤2\le 2≤2 | ≤1 000\le 1\, 000≤1000 |
| 222 | 20%20\%20% | ≤1 000\le 1\,000≤1000 | ≤2\le 2≤2 |
| 333 | 60%60\%60% | ≤1 000\le 1\, 000≤1000 | ≤1 000\le 1\, 000≤1000 |
solution
贪心 + 枚举,假设最后只有武器 1 的材料数超过 x,其余的都不超过 x,则此时肯定是符合条件的,通过枚举 x,然后贪心法算出每个 x 对应的最小花费,所有 x 中最小的花费即为最低花费
代码
#include <iostream>
#include "bit"
#include "vector"
#include "unordered_set"
#include "unordered_map"
#include "set"
#include "queue"
#include "algorithm"
#include "bitset"
#include "cstring"
#include "cmath"
using namespace std;
/*
* 设其它的武器材料数不超过 x,超过 x 的部分改成武器 1, 如果此时 cnt[1] 不够 x + 1,则将剩余的花费最小的改成x
*/
typedef long long ll;
ll m, n, ans = 2e18;
vector<ll> a[1001];
void f(int x) {
ll s = (ll) (a[1].size()), sum = 0;
vector<ll> temp;
for (int i = 2; i <= n; i++) {
for (int j = 0; j + x < a[i].size(); j++) {
sum += a[i][j];
s++;
}
for (int j = max(int(a[i].size()) - x, 0); j < a[i].size(); j++) {
temp.push_back(a[i][j]);
}
}
std::sort(temp.begin(), temp.end());
int k = 0;
while (s <= x && k < temp.size()) {
sum += temp[k++];
s++;
}
if (s > x) ans = min(ans, sum);
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int p, c;
cin >> p >> c;
a[p].push_back(c);
}
for (int i = 2; i <= n; i++) {
std::sort(a[i].begin(), a[i].end());
}
for (int i = 0; i < m; i++) f(i);
cout << ans;
}
结果

更多推荐

所有评论(0)