2172: GJJ的日常之购物

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 9  Solved: 8

SubmitStatusWeb Board

Description

一天,GJJ去购物,来到商场门口,GJJ计划要买n个商品,第i个商品的坐标为(xi,yi),重量是wi。
GJJ比较任性,想按照商品编号从小到大的顺序将所有的商品的搬到车里(车在(0,0)的位置);
GJJ可以几个商品一起搬,但在任何时候GJJ手中的商品重量不能超过最大载重C。
商场的过道只有横着的和竖着的。求GJJ行走的最短距离(GJJ的起始位置为(0,0))。

Input

第一行输入一个T(T<=10),表示T组数据。
每组数据第一行为最大载重C(1<=C<=100),商品个数n(n<=100000);
接下来n行,每行为xi,yi,wi,(0<=xi,yi<=100,wi<=C)既商品的坐标和重量

Output

对于每组数据,输出总路径的最短长度。

Sample Input

2
10 4
1 2 3
1 0 3
3 1 4
3 1 4
5 1
1 1 2

Sample Output

14
4
推了1h方程可惜是错误的= =。
可以理解为取第i件物品时是取了前j件物品(j<i)放回车后,再次取i之前j之后的物品一次性取到i然后返回(如果可以的话).
设f(i)表示为 将前i件物品放到车上的最短距离  d1[i]表示0->1->2......->i点所有距离之和     d2[i]表示0->i的距离
那么我们有 f[i]=MIN{ f[j]+d2[j+1]+d1[i]-d1[j+1]+d2[i] | j<i&&j+1至i所有物品重量<=C }
                   f[i]=MIN{ f[j]+d2[j+1]-d1[j+1] }+d1[i]+d2[i] ;
对于MIN里的显然我们可以维护一个最小值,优先队列即可完成,每计算出一个f[i]时就push进去一个 f[i]+d2[i+1]-d1[j-1],
每次取队首时要判断是否满足重量条件,如果不满足直接pop,因为后面的更不会满足,这个节点已经没用。
 #include<bits/stdc++.h>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3f
int d1[],d2[],f[];
int x[],y[],w[];
struct node
{
int u,w;
bool operator<(const node &tmp)const{
return w>tmp.w;
}
};
priority_queue<node>Q;
int main()
{
// freopen("in.txt","r",stdin);
int T,C,N,i,j,k;
cin>>T;
while(T--){
while(!Q.empty()) Q.pop();
cin>>C>>N;
for(i=;i<=N;++i)
{
scanf("%d%d%d",&x[i],&y[i],&w[i]);
w[i]+=w[i-];
d1[i]=d1[i-]+abs(x[i]-x[i-])+abs(y[i]-y[i-]);
d2[i]=x[i]+y[i];
}
f[]=d2[]*;
Q.push(node{,});
Q.push(node{,f[]+d2[]-d1[]});
for(i=;i<=N;++i)
{
node tmp=Q.top();
while(!Q.empty()&&w[i]-w[tmp.u]>C){
Q.pop();
tmp=Q.top();
}
f[i]=tmp.w+d2[i]+d1[i];
Q.push(node{i,f[i]-d1[i+]+d2[i+]});
}
cout<<f[N]<<endl;
}
return ;
}
//注释freopen语句!!!

zzuli 2172 队列优化dp的更多相关文章

  1. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  2. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

  3. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  4. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  5. BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP

    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...

  6. 【单调队列优化dp】 分组

    [单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...

  7. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

  8. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  9. BZOJ1791[Ioi2008]Island 岛屿 ——基环森林直径和+单调队列优化DP+树形DP

    题目描述 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...

随机推荐

  1. python基础之类的封装

    从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 一 封装什么 你钱包的有多少钱(数据的封装) 你的性取向( ...

  2. 浅谈REDIS数据库的键值设计(转)

    add by zhj: 关系数据库表的一条记录可以映射成Redis中的一个hash类型,其实数据库记录本来就是键值对.这样,要比本文中的键设计用更少的键,更节省内存,因为每个键除了它的键值占用内存外, ...

  3. Hessian矩阵与多元函数极值

    Hessian矩阵与多元函数极值 海塞矩阵(Hessian Matrix),又译作海森矩阵,是一个多元函数的二阶偏导数构成的方阵.虽然它是一个具有悠久历史的数学成果.可是在机器学习和图像处理(比如SI ...

  4. Dora.Interception, 为.NET Core度身打造的AOP框架[3]:Interceptor的注册

    在<不一样的Interceptor>中我们着重介绍了Dora.Interception中最为核心的对象Interceptor,以及定义Interceptor类型的一些约定.由于Interc ...

  5. C语言高级宏技巧

    特殊符号#.## (1)# When you put a # before an argument in a preprocessor  macro, the preprocessor turns t ...

  6. 利用反射快速给Model实体赋值

    试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...

  7. Java集合(4):Iterator(迭代器)

    迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的Iterator功能比较简单, ...

  8. Python 优雅的操作字典

    Python 中的字典是Python中一个键值映射的数据结构,下面介绍一下如何优雅的操作字典. 来源:https://www.linuxzen.com/python-you-ya-de-cao-zuo ...

  9. 笔记-Markdown常用语法

    其实应该很早就已经接触到了Markdown这种简洁却彪悍的标记语言,比如Github的README.md,只不过被不走心的我当作txt文档来用了.直到前个看到一位大神的读书列表清单,觉得很新奇,就有意 ...

  10. 【leetcode刷题笔记】Find Minimum in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...