题目描述

小杨有 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。此时,武器 111222 种强化材料适配,武器 222 和武器 333 都各有 111 种强化材料适配,满足适配第 111 种武器的强化材料种类数严格大于其他的武器。

数据范围

对于 100%100\%100% 的数据,保证 1≤n,m≤1 0001\le n,m\le 1\, 0001n,m10001≤pi≤n1\le p_i\le n1pin1≤ci≤1091\le c_i\le 10^91ci109

子任务编号 得分占比 nnn mmm
111 20%20\%20% ≤2\le 22 ≤1 000\le 1\, 0001000
222 20%20\%20% ≤1 000\le 1\,0001000 ≤2\le 22
333 60%60\%60% ≤1 000\le 1\, 0001000 ≤1 000\le 1\, 0001000

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;
}

结果

在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐