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\n", 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\n",dp[e][k]);//到达5点,购买k的花费就是答案。
}
return 0;
}

BUYING FEED的更多相关文章

  1. ACM BUYING FEED

    BUYING FEED 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 Farmer John needs to travel to town to pick up ...

  2. 2020: [Usaco2010 Jan]Buying Feed, II

    2020: [Usaco2010 Jan]Buying Feed, II Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 220  Solved: 162[ ...

  3. 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II

    洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II https://www.luogu.org/problemnew/show/P2616 题目描述 Farmer ...

  4. USACO Buying Feed, II

    洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II 洛谷传送门 JDOJ 2671: USACO 2010 Jan Silver 2.Buying Feed, II ...

  5. 【P2616】 【USACO10JAN】购买饲料II Buying Feed, II

    P2616 [USACO10JAN]购买饲料II Buying Feed, II 题目描述 Farmer John needs to travel to town to pick up K (1 &l ...

  6. 【BZOJ】2020: [Usaco2010 Jan]Buying Feed, II (dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2020 和背包差不多 同样滚动数组 f[j]表示当前位置j份食物的最小价值 f[j]=min(f[j- ...

  7. Buying Feed, 2010 Nov (单调队列优化DP)

    约翰开车回家,又准备顺路买点饲料了(咦?为啥要说"又"字?)回家的路程一共有 E 公里,这一路上会经过 K 家商店,第 i 家店里有 Fi 吨饲料,售价为每吨 Ci 元.约翰打算买 ...

  8. [河南省ACM省赛-第三届] BUYING FEED (nyoj 248)

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> us ...

  9. 【BZOJ2059】Buying Feed 购买饲料

    题面 约翰开车来到镇上,他要带V吨饲料回家.如果他的车上有X吨饲料,每公里就要花费X^2元,开车D公里就需要D* X^2元.约翰可以从N家商店购买饲料,所有商店都在一个坐标轴上,第i家店的位置是Xi, ...

随机推荐

  1. gcc 4.8.5安装

    在利用张乐博士的最大熵模型工具包(Maximum Entropy Modeling Toolkit for Python and C++)和条件随机场的经典工具包CRF++(CRF++: Yet An ...

  2. vc中播放mp3文件的方法小结

    一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便. 1.      使用mci #include <windows.h> ...

  3. CodeForces - 1017E :The Supersonic Rocket (几何+KMP,判定凸包是否同构)

    After the war, the supersonic rocket became the most common public transportation. Each supersonic r ...

  4. Gym 101142G : Gangsters in Central City(DFS序+LCA+set)

    题意:现在有一棵树,1号节点是水源,叶子节点是村庄,现在有些怪兽会占领一些村庄(即只占领叶子节点),现在要割去一些边,使得怪兽到不了水源.给出怪兽占领和离开的情况,现在要割每次回答最小的割,使得怪兽不 ...

  5. 《Kubernetes权威指南第2版》学习(三)RC学习

    1 RC文件介绍: kind: ReplicationController,表示是一个RC: spec.selector:  RC的Pod标签(Label)选择器,监控和管理拥有这些标签的Pod实例, ...

  6. JSP介绍(3)---JSP表单处理

    GET方法: GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔.如下所示: http://www.runoob.com/hello?key1=value1& ...

  7. oracle--分页过程demo1

    oracle分页过程demo1: --ROWNUM用法 select o.*,rownum rn from (select * from emp) o where rownum<=10; sel ...

  8. Python-IO模式介绍

    事件驱动模型:有个事件队列,把事件放到队列里,然后循环这个队列,取出事件执行 5种IO模式: 阻塞 I/O(blocking IO) 非阻塞 I/O(nonblocking IO) I/O 多路复用( ...

  9. mysql数据库之表与表之间的关系

    表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 ...

  10. JAVAWeb SSH框架 上传文件,如2007的EXCEL

    下面的代码是上传EXCEL的代码,其实,就是在上传文件到服务器,代码都差不多,只是接收的文件的类型改一下即可. 1.jsp 用的是struts2 标签 代码: <s:file name=&quo ...