NYOJ 248 && BNUOJ 4151 BUYING FEED (贪心)

来源:互联网 发布:成长相册制作软件 编辑:程序博客网 时间:2024/05/17 21:54

【题目链接】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;}


1 0