1. 程式人生 > >USACO mixing milk 混合牛奶

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;
}