USACO-Section 1.3 Mixing Milk[...]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值