2017-05-30
题目大意:
输入的第一行给出两个整数,第一个整数 N (0 <= N <= 2,000,000)表示需求的牛奶的数量,第二个整数M(0 <= M <= 5,000)表示牛奶提供者的数量。接下来的M行每行有两个整数,表示每个牛奶提供者所提供牛奶的单价以及他们可以提供的牛奶的数量。求购得所需数量的牛奶最少需要的价格。
样例输入:
100 5
5 20
9 40
3 10
8 80
6 30
样例输出:
630
题解:
思路没有什么特别的,就是在还没有购得足够的牛奶时,找出还有牛奶供应且单价最低的提供者,向此提供者购买所能购买的最大、且不超过所需数量的牛奶。
代码如下:
/*
ID: madara01
PROG: milk
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#define cin fin
#define cout fout
#define MAX 5001
using namespace std;
int wantedAmount,providers;
int farmers[2][MAX];
int findCheapest() //找出目前有牛奶可提供且价格最低的农民的编号
{
int i,theOne,min = 999999; //min这个值要设的大一点,我最开始设的100结果有个测试数据里price全部为1000...
for(i = 0; i < providers; i++)
{
if(farmers[1][i] > 0 && farmers[0][i] < min)
{//先判断此农民是否还有牛奶可提供,因为不满足此条件则无需判断下一条件
min = farmers[0][i];
theOne = i;
}
}
return theOne;
}
int main(int argc, char **argv)
{
int i,cost = 0;
ofstream fout ("milk.out");
ifstream fin ("milk.in");
cin >> wantedAmount >> providers;
for(i = 0; i < providers; i ++)
{
cin >> farmers[0][i] >> farmers[1][i];
}
while(wantedAmount > 0)
{
i = findCheapest();
if(wantedAmount <= farmers[1][i]) //已经有了足够的牛奶
{
cost = cost + wantedAmount * farmers[0][i];
wantedAmount = 0;
}
else //还需要再购进牛奶
{
wantedAmount = wantedAmount - farmers[1][i];
cost = cost + farmers[1][i] * farmers[0][i];
farmers[1][i] = 0;
}
}
cout << cost << endl;
return 0;
}