洛谷(LG)P1208 [USACO1.3]混合牛奶 Mixing Milk 题解


关键词:贪心,模拟!!!

啥都不说了,直接看代码

 include <algorithm>//快排需要

#include <iostream>

#include <utility>//pair所需要的头文件 #include <cstdio>//标准化输入输出(scanf和printf)不会用的同学要常常使用,这个比cin和cout快 using namespace std; int n,m;//n是一共需要多少份牛奶,m是有多少人可以提供牛奶 //这个n也是实时更新的 pair < int , int > p[5005];//第一关键字:费用;第二关键字数量 //pair是STL中的一个,有两个参数组成 ,分别是第一关键字和第二关键字,这里应用的原因就是:pair 定义的数组排序按照第一关键字优先排序,第一关键字相同按照第二关键字排序的特点 //就把pair当做一个变量 first,另一个变量是second的结构体就好了,就是在快速排序排序时可以偷懒少写一个cmp。 //pair的调用也很简单,//eg(例如)pair < int ,int > s ;(要加入分号的 )s.first 就是第一关键字,s.second就是第二关键字 long long sum; //不用long long可能要爆的 ,sum就是最后要输出的 int main() { scanf("%d%d",&n,&m);//输入输出,记得加取地址符“&” for(int i=0;i<m;++i)//循环读入数据,第一关键字是单价,第二关键字是数量 scanf("%d%d",&p[i].first,&p[i].second); sort(p,p+m);//快排,因为用了pair所以不用写cmp排序函数 for(int i=0;i<m;++i)//排序好了所以从头开始遍历 {//这里的p[i]方案都是当前没有买奶的单价最便宜的 if(n<=p[i].second)//判断如果需要买的奶<=这个奶农卖的最高数量 { sum+=p[i].first*n;//sum加上这个人买的单价*剩下的需要购入的牛奶 break;//因为已经买够了,所以跳出循环 } //因为如果买够了就会跳出循环,所以这里不用在加一个if()判断了 //都是在n>奶农卖的最高数量 //所以当遇到这个人的时候就会买光他提供的奶——因为贪心,他买的是当前最便宜的,(sort排序过) sum+=p[i].first*p[i].second;//sum加上买光这个人提供的牛奶的花费 n-=p[i].second; //因为我们的n是实时更新的,所以,这个地方n要减去买入的牛奶的数量 //进入下一层循环 } printf("%d\n",sum);//最后把答案输出(我个人习惯在最后输出一个换行,并不算错) return ~~(0-0);//撒花结尾 }

请大家注意,特别是还不会使用STL 的小伙伴,STL是个好东西,一定要记得使用啊!

猜你喜欢

转载自www.cnblogs.com/--nice--/p/10403126.html