B4450 [GESP202512 三级] 小杨的智慧购物
B4450 [GESP202512 三级] 小杨的智慧购物
题目背景
对应的选择、判断题:https://ti.luogu.com.cn/problemset/1199
题目描述
小杨的班级要举办一个环保手工作品展览,老师请小杨去文具店购买 M 种不同的文具(例如:铅笔、橡皮、尺子等)。
商店里共有 N 件文具,每件文具都有一个种类编号(从 1 到 M)和价格。
小杨的预算有限,他想了一个聪明的办法:对于每种文具,他只买最便宜的那一件(如果同种文具有多件价格相同且都是最便宜的,他只会购买其中的一件)。请你帮小杨计算出,买齐这 M 种文具一共需要花费多少钱。
输入格式
第一行两个正整数 M, N,代表文具的种类数和总数。
之后 N 行,每行两个正整数 Ki 和 Pi,分别代表第 i 件文具的种类编号和它的价格。数据保证每个种类至少有一件文具可供购买。
输出格式
输出一行,代表购买文具的总价。
输入输出样例 #1
输入 #1
2 5
1 1
1 2
1 1
2 3
2 10
输出 #1
4
说明/提示
样例解释
文具清单如下:
-
文具 1:种类 1,价格 1
-
文具 2:种类 1,价格 2
-
文具 3:种类 1,价格 1
-
文具 4:种类 2,价格 3
-
文具 5:种类 2,价格 10
小杨的选择过程:对于种类 1:有三件商品,价格分别为 1, 2, 1。其中最便宜的价格是 1。对于种类 2:有两件商品,价格分别为 3, 10。其中最便宜的价格是 3。
计算总价:小杨购买这两类文具的总花费为 1 + 3 = 4。
数据范围
对于所有测试点,保证 1 ≤ M ≤ N ≤ 10^5,1 ≤ Ki ≤ M,1 ≤ Pi ≤ 10^3。
1.题目有哪些变量
M种文具
N件文具
数组k[i]:第i件文具的种类编号
数组p[i]:第i件文具的价格
2.有哪些可能需要额外定义的变量
想不到就跳过
想得到应该是vis[i]:标记第i种文具的最小花费
3.题目问的是什么?
购买完m种文具的总费用
样例里有M=2种文具,N=5件文具
第1种文具最小费用是1元
第2种文具最小费用是3元
所以总花费是4元
4.解题思路
定义标记数组vis,并初始化M种文具的最小花费为vis[i] = 99999,方便后续比较最小值
然后对于N件文具输入的k[i]和p[i],k[i]是种类编号,那么比较第k[i]种文具的最小花费写法就是
vis[k[i]] = min(vis[k[i]],p[i])
最后答案就是m种文具的最小花费总和
即:vis[1] + vis[2] + vis[3] +...+vis[m]
5.代码及注释
#include<bits/stdc++.h> #define ll long long using namespace std; const int N = 2e5 + 10,inf = 0x3f3f3f3f; int n,m,k[N],p[N]; int vis[N]; int main() { cin >> m >> n; for(int i = 1; i <= m; i++) vis[i] = 9999999;//初始化第i种文具价格较大 for(int i = 1; i <= n; i++){ cin >> k[i] >> p[i]; //更新种类k[i]的最小值 vis[k[i]] = min(vis[k[i]],p[i]); } int ans = 0; for(int i = 1; i <= m; i++) ans += vis[i]; //把m个种类最小值累加 cout << ans; return 0; }

浙公网安备 33010602011771号