USACO 1.3 Mixing Milk (快排+贪心)

#include <stdio.h>
#define DEBUG 0
#define TESTCASES 9

#define MAX_FARMERS 5000
int milkNeeded;
int numOfFarmers;
typedef struct Farmer{
	int price;
	int milk;
}Farmer;
Farmer farmers[MAX_FARMERS + 1];

void sortFarmersAccordingToPrice(int first, int last){
	while (first < last){
		Farmer pivotFarmer = farmers[first];
		int pivotPrice = farmers[first].price;
		int left = first;
		int right = last;
		while (left < right){
			while (left < right && farmers[right].price >= pivotPrice)
			right--;
			farmers[left] = farmers[right];
			while (left < right && farmers[left].price <= pivotPrice)
			left++;
			farmers[right] = farmers[left];
		}
		farmers[left] = pivotFarmer;
		int pivot = left;
		sortFarmersAccordingToPrice(first, pivot);
		first = pivot + 1;		
	}
}
int mix(){
	int minPrice = 0;
	int milkMixed = 0;
	int farmer;
	for (farmer = 1; farmer <= numOfFarmers; farmer++){
		if (milkMixed  + farmers[farmer].milk >= milkNeeded){
			minPrice += farmers[farmer].price * (milkNeeded - milkMixed);
			break;
		} else {
			milkMixed += farmers[farmer].milk;
			minPrice += farmers[farmer].price * farmers[farmer].milk;
		}			
	}
	return minPrice;
}

int main(){
#if DEBUG
	int testCase;
	for (testCase = 1; testCase <= TESTCASES; testCase++){
		char inputFileName[20] = "milk.inX";
		inputFileName[7] = '1' +  (testCase - 1);
		freopen(inputFileName, "r", stdin);
		printf("\n#%d\n", testCase);
#endif
	
	scanf("%d %d", &milkNeeded, &numOfFarmers);
	int farmer;
	for (farmer = 1; farmer <= numOfFarmers; farmer++)
		scanf("%d %d", &farmers[farmer].price, &farmers[farmer].milk);

	sortFarmersAccordingToPrice(1, numOfFarmers);

	int minPrice = mix();

	printf("%d\n", minPrice);

#if DEBUG
	}
#endif
	return 0;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值