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

 

posted @ 2026-01-30 16:48  CRt0729  阅读(0)  评论(0)    收藏  举报