3110: 精明的采购员John
描述
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;
}