3110: 精明的采购员John

3110: 精明的采购员John 分享至QQ空间 去爱问答提问或回答

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte

描述

John是一位采购员,每天他都要为学校食堂采购大量的蔬菜以保证一天的供给。

由于John是个大客户,因此在John家和学校之间的马路上到处都是摊位,John家到学校的距离为E(1<=E<=100)米,马路可以认为是笔直的,马路上有N(1<=N<=100)个摊位(我们将其编号为1,2,3...N),第i个摊位的坐标为Xi,可以供给的蔬菜总共有Fi公斤(1<=Fi<=100),售价为每公斤Ci(1<=Ci<=1,000,000)元。注意同一点可能有多个摊位。

John家就位于坐标0点,而学校位于马路的另一头E点,为了节省开支,John每天都是在上班的时候顺路采购,然后将蔬菜送到学校,他今天的任务就是开着大卡车采购K(1<=K<=100)公斤的蔬菜,卡车耗掉的油费只与蔬菜重量有关,如果卡车载K公斤蔬菜行驶D米路需要耗费D*K元钱。

John是一个精明的采购员,对市场上价格了如指掌,因此他知道如何节省开支,以最少的花费购得所需的蔬菜。比如John需要购买2公斤蔬菜,马路上有3个摊位(分别位于离家1,3,4米处,学校位于5米处),每个摊位最大供货量为1,1,1,每公斤价格分别为1,2,2。

如下图所示:

      0   1   2   3   4   5
      +---|---+---|---|---+
          1       1   1      最大供货量
          1       2   2      每公斤价格

如果John从3和4米处摊位分别购买1公斤,他需要花费4元购菜钱,然后从3米处摊位拉1公斤蔬菜要耗油费1*1元钱,再从4米处拉2公斤蔬菜到终点5米处需要1*2元钱,因此总共需要花费7元钱,John通过与其他方式的比较发现,这是最佳的采购方案了。

但是John也发现,当摊位更多时,寻求最佳采购方案所花费的精力已经难以承受,现在就希望你编写程序来帮忙决策,John完成任务最少需要多少元钱。

输入

输入数据有多组,每组数据有N+1行。

第一行为3个整数K、E和N,接下来有N行,每行有3个整数,分别是Xi、Fi和Ci,具体含义见题目描述。

处理到文件结束位置(即EOF结束)。

输出

每组数据输出只有一个整数,即John在完成任务的前提下最小的花费(单位为元)。

样例输入

   
   
2 5 3 3 1 2 4 1 2 1 1 1

样例输出

   
   
7

题目来源

台州学院第二届新生程序设计竞赛



//思路:将运输单价加进自身的单价中,然后按总的单价排序,优先选择小的
#include <iostream>
#include <algorithm>
using namespace std;

struct Node
{
    int x;
    double f,c;
    bool operator<(const Node &n)const
    {
        return c<n.c;
    }
}nodes[105];

int main()
{
    int k,e,n;
    while(cin>>k>>e>>n)
    {
        for(int i = 0 ; i < n ; i++)
        {
            cin>>nodes[i].x>>nodes[i].f>>nodes[i].c;
            nodes[i].c+=(e-nodes[i].x); //宏观来看单价是自身的价值加上运输的费用
        }
        sort(nodes,nodes+n);//按单价从小到大排序,优先选用价钱小的
        int ans = 0;
        for(int i = 0 ; i < n ; i++)
        {
            if(k>0)
            {
                if(k>=nodes[i].f)
                {
                    ans+=nodes[i].f*nodes[i].c;
                    k-=nodes[i].f;
                }
                else
                {
                    ans+=nodes[i].c*k;
                    k = 0;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值