原题链接:MJUPC-006_F.原神:原石的优惠大礼包
F.原神:原石的优惠大礼包
题目描述
米哈游公司下的著名开发世界冒险类游戏——原神,正迎来发行一周年的庆典活动,正因如此,瞧中商机的黄牛们纷纷通过自己的渠道屯了大量比官方更低价的且有限的原石。
派蒙现在需要买到 n n n 个原石,派蒙叫来好友们,拿到了所有黄牛的交易方式,一共有 m m m 个黄牛。
每个黄牛都有自己定义的原石单价,且每个黄牛能够出售的原石数量也可能是不同的。
派蒙想知道怎么才能以最低消费买到所需要的 n n n 个原石。
输入格式
第一行二个整数 n , m n,m n,m,表示需要原石的总量,和提供原石的黄牛个数。
接下来 m m m 行,每行两个整数 p i , a i p_i,a_i pi,ai,表示第 i i i 个黄牛出售的原石的单价,和黄牛 i i i 最多能出售的原石数量。
输出格式
单独的一行包含单独的一个整数,表示派蒙拿到所需的原石所要的最小费用。
输入输出样例
输入 #1:
100 5 5 20 9 40 3 10 8 80 6 30
输出 #1:
630
说明/提示
【数据范围】
对于 100 % 100\% 100% 的数据:
0 ≤ n , a i ≤ 2 × 1 0 6 0 \le n,a_i \le 2 \times 10^6 0≤n,ai≤2×106, 0 ≤ m ≤ 5000 0\le m \le 5000 0≤m≤5000, 0 ≤ p i ≤ 1000 0 \le p_i \le 1000 0≤pi≤1000
【出题人】
TIT_0
题目解析:
读题后可以发现,目的是以最低消费购买需要的 n n n 个原石,由题,我们不需要担心是否有 n n n 个原石,因此我们的目的就变成了最低消费。
购买方式没有限制,显然这是一道贪心题,保存输入数据后,以各个黄牛的原石单价为关键字做排序,最后遍历统计花费即可(遍历过程中要注意购买的数量不要超出所需的 n n n 个原石)。
AC代码(C++):
#include <bits/stdc++.h>
using namespace std;
pair<int, int> pedlars[5000];
bool cmp(pair<int, int> a, pair<int, int> b) { return a.first < b.first; } //cmp比较器重构
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) cin >> pedlars[i].first >> pedlars[i].second;
int ans = 0, cost, amount;
sort(pedlars, pedlars + m, cmp);
for (int i = 0; i < m && n > 0; i++)
{
cost = pedlars[i].first, amount = pedlars[i].second;
if (n >= amount) ans += amount * cost, n -= amount;
else ans += n * cost, n = 0;
}
cout << ans << endl;
return 0;
}