【题目链接】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; }
时间: 2024-10-12 19:56:03