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

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


你可能感兴趣的:(ACM,贪心)