今天来分享一下P1208 [USACO1.3] 混合牛奶 Mixing Milk,这是一道用了贪心思想的题。什么是贪心思想,就是每一步都以最优解来考虑,来达到最后的结果。这需要这道题每步最优之后,最终的结果也是最优,所以并不是所有的题都能用贪心思想。而本题需要找到最便宜的牛奶采购方案,每步都去找最便宜的采购,最后恰恰也是最便宜的。贴一下代码。
#include <bits/stdc++.h>
using namespace std;
struct milk{
long num=1001;
long p;
};
bool cmp(milk x,milk y)
{
return x.num<y.num;
}
int main (){
long n,m;
cin>>n>>m;
milk Milk[2000000];
for(int i = 0;i<m;i++){
cin>>Milk[i].num>>Milk[i].p;
}
sort(Milk+0,Milk+m,cmp);
long fee = 0;
for(int i=0;i<m;i++){
if(Milk[i].p<=n){
fee += Milk[i].p*Milk[i].num;
n-=Milk[i].p;
}
else{
fee += Milk[i].num*n;
break;
}
}
cout<<fee;
return 0;
}
这道题运用贪心思想还是很简单的,值得一提的是结构体的排序。众所周知,在c++的基础库中会提供一个sort函数,非常的好用,但是对于结构体他究竟该怎么使用呢?就是要先对结构体里作为基准排序的那个元素添加一个函数,来对元素的大小判断输出是否。然后在使用sort函数中,分别在第一个位置传入,数组的名字加上第一个元素的位置,再在第二个位置传入排序的最后一个元素位置+1,在第三个位置传入判断函数。这样就可以按照结构体数组的指定元素顺序来排序整个数组了。