题目

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1984

题意

按顺序给出平面n个点,每个点上都有重物,一次只能按顺序拿重量不超过c的重物,从原点出发并且返回原点,问至少多少次能把全部重物拿回原点

思路

明显,令dp[i]为从1拿到i所需的最小出发次数,令dist0[i]为从原点到i的距离,令dist[i]为从i到i-1的距离(点0不妨设置为原点),令distSum[i] = sum(dist[0]...dist[i]),则dp[j] = dp[j] + dist0[j] + distSum[j] + dp[i] + dist0[i + 1] - distSum[i+1],此处j > i且i+1...j的重物重量和不超过c。设mycost[i] = dp[i] + dist0[i + 1] - distSum[i+1],明显,可以使用尺取+优先队列来维护重量和不超过c和 dp[i] + dist0[i + 1] - distSum[i+1]最小这两个条件。

但刘书提出了进一步优化:由于当新加入的点i的mycost比尺取区间中维护的旧点小的时候,这些旧点是没有用的,可以不考虑它们。当这样做了之后,剩下的点总能成为一个递增序列,这样就非常容易维护。

感想

一开始DP公式推错了,弄成了还从该点出发

代码

#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#define LOCAL_DEBUG
using namespace std;
typedef pair<int, int> MyPair;
const int MAXN = 1e5 + ;
int n, c;
int x[MAXN];
int y[MAXN];
int w[MAXN];
int wSum[MAXN];
int distSum[MAXN];
int dist0[MAXN];
int dp[MAXN];
int mydeque[MAXN];
int mycost[MAXN]; #define MYCOST(x) (dist0[(x) + 1] - distSum[(x) + 1] + dp[(x)]) int main() {
#ifdef LOCAL_DEBUG
freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\input.txt", "r", stdin);
//freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\output.txt", "w", stdout);
#endif // LOCAL_DEBUG
int T;
scanf("%d", &T);
for (int ti = ; ti <= T && scanf("%d%d", &c, &n) == ; ti++) {
for (int i = ; i <= n; i++) {
scanf("%d%d%d", x + i, y + i, w + i);
dist0[i] = abs(x[i]) + abs(y[i]);
}
for (int i = ; i <= n; i++) {
wSum[i] = w[i] + wSum[i - ];
distSum[i] = abs(x[i] - x[i - ]) + abs(y[i] - y[i - ]);
distSum[i] += distSum[i - ];
} int dequeTop = ;
int dequeEnd = ;
mydeque[dequeEnd++] = ;
for (int i = ; i <= n; i++) {
while (dequeTop < dequeEnd && wSum[i] - wSum[mydeque[dequeTop]] > c) {
dequeTop++;
}
assert(dequeTop < dequeEnd);
int f = mydeque[dequeTop];
dp[i] = dist0[i] + dist0[f + ] + distSum[i] - distSum[f + ] + dp[f];
while (dequeTop < dequeEnd && MYCOST(mydeque[dequeEnd - ]) >= MYCOST(i)) {
dequeEnd--;
}
mydeque[dequeEnd++] = i;
}
if (ti != )puts("");
printf("%d\n", dp[n]);
} return ;
}

UVA LA 3983 - Robotruck DP,优先队列 难度: 2的更多相关文章

  1. LA 3983 Robotruck

    这道题感觉挺吃力的,还用到了我不熟悉的优先队列 题目中的推导也都看明白了,总之以后还要多体会才是 这里用优先对列的原因就是因为要维护一个滑动区间的最小值,比如在区间里2在1的前面,2在离开这个滑动区间 ...

  2. UVaLive 3983 Robotruck (DP + 单调队列)

    题意:有n个垃圾,第i个垃圾坐标为(xi,yi),重量为wi,有一个机器人,要按照编号从小到大的顺序剑气所有的垃圾兵扔进垃圾桶,垃圾桶在原点, 每次总重量不能超过C,两点间距离为曼哈顿距离,求出最短的 ...

  3. bzoj 3131 [Sdoi2013]淘金(数位DP+优先队列)

    Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块.    一阵风吹 ...

  4. 【暑假】[深入动态规划]UVAlive 3983 Robotruck

     UVAlive 3983 Robotruck 题目: Robotruck   Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format ...

  5. UVA LA 7146 2014上海亚洲赛(贪心)

    option=com_onlinejudge&Itemid=8&page=show_problem&category=648&problem=5158&mosm ...

  6. UVA.674 Coin Change (DP 完全背包)

    UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...

  7. uva 10817(数位dp)

    uva 10817(数位dp) 某校有m个教师和n个求职者,需讲授s个课程(1<=s<=8, 1<=m<=20, 1<=n<=100).已知每人的工资c(10000 ...

  8. Uva LA 3902 - Network 树形DP 难度: 0

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  9. UVa 11825 - Hackers' Crackdown DP, 枚举子集substa = (substa - 1)&sta 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

随机推荐

  1. Java代码优化,都有哪些常用方法?

    Java代码优化是Java编程开发很重要的一个步骤,Java代码优化要注重细节优化,一个两个的细节的优化,产生的效果不大,但是如果处处都能注意代码优化,对代码减少体积.提高代码运行效率是有巨大帮助的, ...

  2. redhat修改网卡名称

    ●此方法在redhat7.4之后,不能修改成功. 1.编辑网卡的配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 将里面的NAME和DEVICE项修 ...

  3. 记录结果再利用的"动态规划"

    2018-09-24 15:01:37 动态规划(DP: Dynamic Programming)是算法设计方法之一,在程序设计竞赛中经常被选作题材.在此,我们考察一些经典的DP问题,来看看DP究竟是 ...

  4. POP3、SMTP和IMAP介绍和设置

    什么是POP3.SMTP和IMAP? 参照:http://help.163.com/09/1223/14/5R7P6CJ600753VB8.html 用于 Outlook 的 POP 和 IMAP 电 ...

  5. linux计划任务防暴力破解脚本+免密操作

    1.在root创建satools目录 mkdir satools 2.编辑防破解脚本 vi fpj.sh #!/bin/bash #zsl -xie cat /var/log/secure|awk ' ...

  6. OpenGL + VS2015 + Windows10配置

    官网下载OpenGL:https://www.opengl.org/resources/libraries/glut/ 解压后得到5个文件:glut.h,glut.dll,glut32.dll,glu ...

  7. vs2013安装及opencv3.0的配置

     vs2013的安装改善计划,不勾选. Windows8  和 windows phone不勾选  然后进行解压安装.(我安装在了e盘的次级目录) 安装完成,点击“启动” 登陆界面,点击“以后再说”. ...

  8. 使用validate()方法进行输入校验 --Struts2框架

    服务器端的输入校验包含两种方式:硬编码方式和配置文件方式.本文演示硬编码方式中使用validate()方法进行输入校验. 1.项目目录结构: 2.项目核心代码: BookAction.java: pu ...

  9. 使用Tomcat数据源的方式访问数据库(MySql) --Struts2框架应用与开发

    1.为方便测试首先创建数据库和表,然后插入测试数据   2.打开Tomcat服务器安装目录的conf/下的context.xml,配置context.xml文件. 在<Context>标签 ...

  10. Linux中sudo的用法

    一.用户在/etc/sudoers文件中的写法语法规则:授权用户 主机=命令动作 这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用括号括起来,如果不需要密码直接运行 ...