USACO mixing milk 混合牛奶

题目描述

由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助Marry乳业找到最优的牛奶采购方案。

Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的。此外,就像每头奶牛每天只能挤出固定数量的奶,每位奶农每天能提供的牛奶数量是一定的。每天Marry乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶。

给出Marry乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量。计算采购足够数量的牛奶所需的最小花费。

输入格式:

第 1 行共二个数值:N,(0<=N<=2,000,000)是需要牛奶的总数;M,(0<= M<=5,000)是提供牛奶的农民个数。

第 2 到 M+1 行:每行二个整数:Pi 和 Ai。

Pi(0<= Pi<=1,000) 是农民 i 的牛奶的单价。

Ai(0 <= Ai <= 2,000,000)是农民 i 一天能卖给Marry的牛奶制造公司的牛奶数量。

输出格式:

单独的一行包含单独的一个整数,表示Marry的牛奶制造公司拿到所需的牛奶所要的最小费用。

输入样例1:

100 5
5 20
9 40
3 10
8 80
6 30

输出样例1:

630

解题思路

这道题我本以为是动态规划,后来仔细一看样例说明,发现和动态规划一分钱关系都没有。就只是找到价格最便宜的全部买下来而已。如果再卖一个人的就超了,就直接加上还剩的余量乘以价格。
主要是如果要把两个数组以其中一个数组的形式排列例如:

价格 供应量
5 20
9 40
3 10
8 80
6 30

现在要变为

价格 供应量
3 10
5 20
6 30
8 80
9 40

由此可见是以价格为排列方式,将供应量也随着价格变换位置。

用普通方法是完成不了的,这就有了结构体排序

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct milk{
	int price;
	int unit;
}a[10000];
int cmp(milk b,milk c){
	return b.price<c.price;
}
int main(){
//	freopen("milk.in","r",stdin);
//	freopen("milk.out","w",stdout);
	int unit,farmer;
	cin>>unit>>farmer;
	for(int i=0;i<farmer;i++){
		cin>>a[i].price>>a[i].unit;
	}
	sort(a,a+farmer,cmp);
	int cnt=0;
	int price=0;
	for(int i=0;i<farmer;i++){
		if(a[i].unit+cnt<unit){
			cnt+=a[i].unit;
			price+=a[i].price*a[i].unit;
		}else{
			price+=a[i].price*(unit-cnt);
			break;
		}
	}
	cout<<price<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/johnwayne0317/article/details/84995657