洛谷 B4450:[GESP202512 三级] 小杨的智慧购物 ← 贪心算法

​【题目来源】
https://www.luogu.com.cn/problem/B4450

【题目描述】
小杨的班级要举办一个环保手工作品展览,老师请小杨去文具店购买 M 种不同的文具(例如:铅笔、橡皮、尺子等)。
商店里共有 N 件文具,每件文具都有一个种类编号(从 1 到 M)和价格。
小杨的预算有限,他想了一个聪明的办法:对于每种文具,他只买最便宜的那一件(如果同种文具有多件价格相同且都是最便宜的,他只会购买其中的一件)。请你帮小杨计算出,买齐这 M 种文具一共需要花费多少钱。

【输入格式】
第一行两个正整数 M,N,代表文具的种类数和总数。
之后 N 行,每行两个正整数 Ki 和 Pi,分别代表第 i 件文具的种类编号和它的价格。数据保证每个种类至少有一件文具可供购买。

【输出格式】
输出一行,代表购买文具的总价。

【输入样例】
2 5
1 1
1 2
1 1
2 3
2 10

【输出样例】
4

【数据范围】
对于所有测试点,保证 1≤M≤N≤10^5,1≤Ki≤M,1≤Pi≤10^3。

【算法分析】
● 贪心算法说白了就是今朝有酒今朝醉,行事只着眼当下,只求眼前利益最优,既不做长远规划,也不为后续发展预留余地。
● 不过倘若各项选择互不牵扯,当下的决策也不会埋下后患。则只顾眼前的最优选择,自然也就等同于全局最优的选择。可一旦选择之间相互制约、存在隐患,那日后便极易出现疏漏,最终得不偿失。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int inf=0x3f3f3f3f;
const int N=1e5+5;
int a[N];

int main() {
    memset(a,inf,sizeof a);
    int m,n;
    cin>>m>>n;
    while(n--) {
        int k,p;
        cin>>k>>p;
        a[k]=min(a[k],p);
    }

    int tot=0;
    for(int i=1; i<=m; i++) {
        tot+=a[i];
    }
    cout<<tot<<endl;

    return 0;
}

/*
in:
2 5
1 1
1 2
1 1
2 3
2 10

out:
4
*/




【参考文献】
https://gesp.ccf.org.cn/101/attach/1723012369874976.pdf
https://www.luogu.com.cn/problem/solution/B4450


 

posted @ 2026-05-15 20:36  Triwa  阅读(99)  评论(0)    收藏  举报