题面:
话说USACO的题真的好多COW和MILK……*-
解题:
经历丰富的同学应该有过比价的经历,同样的商品优先选择价格最低的,不过,会不会遇到一家店供不应求的情况呢?
无论如何,省钱的秘诀自然都是:价格低的商品尽可能地多买。
固本题用到的是贪心算法。
首先我们用对组pair<int,int>来存放每个奶农提供的 单价/数量,
而这些对组则用我们熟悉的老朋友:vector容器储存
自定义类型排序
为了实现贪心算法,我们必须对单价,也就是对组中的first元素升序排列。
但sort算法并未提供针对pair<int,int>的排序方法,
因此,我们需要写一个仿函数MyCompare,作为其排序方法:
#include<algorithm>
class MyCompare //仿函数,用于sort算法内,实现特殊数据类型的比较
{
public:
bool operator()(pair<int, int>& p1, pair<int, int>& p2)const //重载()为我们的对比函数
{ return p1.first < p2.first; }
};
sort(v.begin(), v.end(), MyCompare()); //调用方法
AC代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, m, ans = 0; //n:需求量 m:奶农数量
vector<pair<int, int>>v;
class MyCompare //仿函数,用于sort算法内,实现特殊数据类型的比较
{
public:
bool operator()(pair<int, int>& p1, pair<int, int>& p2)const //重载()为我们的对比函数
{ return p1.first < p2.first; }
};
int main()
{
cin >> n >> m;
if (n == 0) { cout << 0 << endl; return 0; } //对于需求量为0特判
for(int i=1;i<=m;i++) //输入数据
{
pair<int, int>p;
cin >> p.first >> p.second;
v.push_back(p);
}
sort(v.begin(), v.end(), MyCompare()); //排序的调用
for(int i=0;i<=v.size()-1;i++) //模拟购买牛奶的过程
{
if(n>=v[i].second)
{
ans += v[i].first * v[i].second;
n -= v[i].second;
}
else
{
ans += n * v[i].first;
break;
}
}
cout << ans << endl;
return 0;
}