zoukankan      html  css  js  c++  java
  • BUYING FEED

                                Problem F: F BUYING FEED

    Description

    Farmer John needs to travel to town to pick up K (1 <= K <= 100)pounds of feed. Driving D miles with K pounds of feed in his truck costs D*K cents. 
    The county feed lot has N (1 <= N <= 100) stores (conveniently numbered 1..N) that sell feed. Each store is located on a segment of the X axis whose length is E (1 <= E <= 350). Store i is at 
    location X_i (0 < X_i < E) on the number line and can sell John as much as F_i (1 <= F_i <= 100) pounds of feed at a cost of C_i (1 <= C_i <= 1,000,000) cents per pound. Amazingly, a given point on the X axis might have more than one store. 
    Farmer John starts at location 0 on this number line and can drive only in the positive direction, ultimately arriving at location E, with at least K pounds of feed. He can stop at any of the feed stores along the way and buy any amount of feed up to the the store's limit. 
    What is the minimum amount Farmer John has to pay to buy and transport the K pounds of feed? Farmer John knows there is a solution. 
    Consider a sample where Farmer John needs two pounds of feed from three stores (locations: 1, 3, and 4) on a number line whose range is 0..5: 
    0 1 2 3 4 5 
    --------------------------------- 
    1 1 1 Available pounds of feed 
    1 2 2 Cents per pound 
    It is best for John to buy one pound of feed from both the second and third stores. He must pay two cents to buy each pound of feed for a total cost of 4. When John travels from 3 to 4 he is moving 1 unit of length and he has 1 pound of feed so he must pay 1*1 = 1 cents. 
    When John travels from 4 to 5 he is moving one unit and he has 2 pounds of feed so he must pay 1*2 = 2 cents. The total cost is 4+1+2 = 7 cents.

    Input

    Line 1: Three space-separated integers: K, E, and N Lines 2…N+1: Line i+1 contains three space-separated integers: Xi Fi Ci

    Output

    A single integer that is the minimum cost for FJ to buy and transport the feed

    Sample Input

    2 5 3
    3 1 2
    4 1 2
    1 1 1

    Sample Output

    7

    思路:感觉是dp,但是贪心更好写,更好理解。把每个点运单位物品到终点的花费作为单价,排序。

    AC代码:
    #include<bits/stdc++.h>
    using namespace std;
    const int MAX = 1010;
    
    struct node{
    	int xi;
    	int per;
    	int w;
    }stu[MAX];
    
    int n, e, k;
    bool cmp(node a, node b) {//让每个点都买单位数量到终点的价格作为单价排序 
    	return n-a.xi+a.per < n-b.xi+b.per;
    }
    
    int main() {
    	while(~scanf("%d%d%d", &k, &e, &n)) {
    		for(int i = 0; i < n; i++) {
    			scanf("%d%d%d", &stu[i].xi, &stu[i].w, &stu[i].per);
    		}
    		sort(stu, stu+n, cmp);
    		int sum = 0;//贪心   放包问题 
    		for(int i = 0; i < n; i++) {
    			if(k >= stu[i].w) {
    				k -= stu[i].w;
    				sum += (e-stu[i].xi)*stu[i].w+stu[i].w*stu[i].per;
    			} else {
    				sum += (e-stu[i].xi)*k+k*stu[i].per;
    				k = 0;
    			}
    			if(k == 0)
    				break;
    		}
    		printf("%d
    ", sum);
    	}
    }

    dp思想:dp[i][j]状态为坐标为i,买j的最小花费。需要把所有状态跑一遍。最后结果
    就是dp[n][k], 详细过程见注释。

    AC代码:

    #include<cstdio>
    #include<vector>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int MAX = 200;
    
    struct node
    {
    	int w;
    	int per;
    };
    
    int k,e,n;
    int dp[400][105];// dp[x][w] 其中x为当前坐标,w为已购买数量 
    vector<node>edge[400];
    
    int main()
    {
    	while(~scanf("%d %d %d",&k,&e,&n))
    	{
    		fill(dp[0], dp[0]+MAX*MAX, INF);
    		for(int i=0;i<n;i++)
    		{
    			int xi;
    			node temp;
    			scanf("%d %d %d",&xi,&temp.w,&temp.per);
    			edge[xi].push_back(temp);//一点可能多商店 
    		}
    		dp[0][0]=0;//边界 //求每种状态 
    		for(int i=1;i<=e;i++)
    		{
    			for(int l=k;l>=0;l--)
    			{
    				dp[i][l]=dp[i-1][l];//先继承一下,再去更新 
    				for(int j=0;j<edge[i-1].size();j++)//前面那个点的所有商店,跑一遍 
    				{
    					int Per=edge[i-1][j].per;//当前单价 
    					int W=edge[i-1][j].w;//当前数量 
    					for(int p=0;p<=W;p++)//购买l和w 以内的 物品 的花费 
    						if(l>=p)
    							dp[i][l]=min(dp[i][l],dp[i-1][l-p]+p*Per+(e-i+1)*p);
    							//当前状态的最小花费,要么不买, 要么在前一个的状态中找一个能达到该状态,并且花费小的 
    				}
    			}
    		}
    		printf("%d
    ",dp[e][k]);//到达5点,购买k的花费就是答案。 
    	}
    	return 0; 
    }                

  • 相关阅读:
    多线程、事件驱动与推荐引擎框架选型
    Protobuf协议应用干货
    集群选举算法实现
    基于OpenSSL的HTTPS通信C++实现
    通过UNIX域套接字传递描述符的应用
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    C++反射机制:可变参数模板实现C++反射
    git多个远程仓库
    设计模式—模板方法的C++实现
    Java中的运算符
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/9572978.html
Copyright © 2011-2022 走看看