【题目链接】click here~~
【题目大意】FJ开车去买K份食物,如果他的车上有X份食物。每走一里就花费X元。FJ的城市是一条线,总共E里路,有E+1个地方,标号0~E。FJ从0开始走,到E结束(不能往回走),要买K份食物。城里有N个商店,每个商店的位置是X_i(一个点上可能有多个商店),有F_i份食物,每份C_i元。问到达E并买K份食物的最小花费。
【解题思路】
把每个站点的物品看成是一件物品,每件物品除了价值之外,还附加了从站点到终点的运费。也就是买1磅到达终点时的花费,把它作为这个商店的单价排序一次,最后选择取花费最少的前k个物品。
代码:
#include <bits/stdc++.h>
using namespace std;
struct node
{
int FI_Count,DI_Value;
} shop[102];
bool cmp(const node& s1,const node& s2)
{
return s1.DI_Value<s2.DI_Value;
}
int main()
{
//freopen("1.txt","r",stdin);
int T,K,E,N,dist;
scanf("%d",&T);
while(T--)
{
int cost=0;
scanf("%d%d%d",&K,&E,&N);
for(int i=0; i<N; i++)
{
scanf("%d%d%d",&dist,&shop[i].FI_Count,&shop[i].DI_Value);
shop[i].DI_Value+=E-dist;//每个站点的每磅物品看成是一件物品,每件物品除了卖价之外,还附加了从站点到终点的运费
}
sort(shop,shop+N,cmp);
for(int i=0;i<=K;i++){
if(K>shop[i].FI_Count){//买物品
cost+=shop[i].DI_Value*shop[i].FI_Count;
K-=shop[i].FI_Count;
}
else{//剩余物品不够K件
cost+=shop[i].DI_Value*K;
K=0;
}
}
printf("%d\n",cost);
}
return 0;
}