UVA LA 3983 - Robotruck DP,优先队列 难度: 2
题目
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的更多相关文章
- LA 3983 Robotruck
这道题感觉挺吃力的,还用到了我不熟悉的优先队列 题目中的推导也都看明白了,总之以后还要多体会才是 这里用优先对列的原因就是因为要维护一个滑动区间的最小值,比如在区间里2在1的前面,2在离开这个滑动区间 ...
- UVaLive 3983 Robotruck (DP + 单调队列)
题意:有n个垃圾,第i个垃圾坐标为(xi,yi),重量为wi,有一个机器人,要按照编号从小到大的顺序剑气所有的垃圾兵扔进垃圾桶,垃圾桶在原点, 每次总重量不能超过C,两点间距离为曼哈顿距离,求出最短的 ...
- bzoj 3131 [Sdoi2013]淘金(数位DP+优先队列)
Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹 ...
- 【暑假】[深入动态规划]UVAlive 3983 Robotruck
UVAlive 3983 Robotruck 题目: Robotruck Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format ...
- UVA LA 7146 2014上海亚洲赛(贪心)
option=com_onlinejudge&Itemid=8&page=show_problem&category=648&problem=5158&mosm ...
- UVA.674 Coin Change (DP 完全背包)
UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...
- uva 10817(数位dp)
uva 10817(数位dp) 某校有m个教师和n个求职者,需讲授s个课程(1<=s<=8, 1<=m<=20, 1<=n<=100).已知每人的工资c(10000 ...
- Uva LA 3902 - Network 树形DP 难度: 0
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- 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 ...
随机推荐
- 你真的了解restful api吗?
前言 在以前,一个网站的完成总是“all in one”,页面,数据,渲染全部在服务端完成,这样做的最大的弊端是后期维护,扩展极其痛苦,开发人员必须同时具备前后端知识.于是慢慢的后来兴起了前后端分离的 ...
- 力扣(LeetCode)976. 三角形的最大周长
给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. 示例 1: 输入:[2,1,2] 输出:5 示例 2 ...
- ssh REMOTE HOST IDENTIFICATION HAS CHANGED!
连接到docker的时候,有时因为image重新buid过,就提示 It is also possible that a host key has just been changed. 不让连接. 解 ...
- Lasso linear model实例 | Proliferation index | 评估单细胞的增殖指数
背景:We developed a cell-cycle scoring approach that uses expression data to compute an index for ever ...
- 怎么从bam文件中提取出比对OR没比对上的paired reads | bamToFastq | STAR
折腾这么多都是白瞎,STAR就有输出没有别对上的pair-end reads的功能 参见:How To Filter Mapped Reads With Samtools I had the same ...
- 混合测序(Pooling)
什么是高通量测序技术中的多重测序? 多重测序是指将带有特殊分子标签(barcode或者index)的不同来源的DNA标本,放入一个反应体系进行测序的方法.与一次检测一种来源的DNA相比,多重检测通过分 ...
- Linux ----> debian中环境的常见配置
环境: (debian 9)/(lubuntu18.0.4+virtualbox) 1.配置下载源: gedit /etc/apt/sources.list #163 deb http://mirro ...
- WAV和PCM文件转换的程序
using System;using System.IO;using System.Text;using System.Windows.Forms;using System.Runtime.Inter ...
- p1468 Party Lamps
就是模拟.同一个开关按2下相当于没按,那么,如果一共按0下,就是没按,按1下就是4个开关的1个,按2下可能相当于实际按了0下或按2下,按3下实际按了1下或3下,之后如果是奇数,相当于按1或3下,偶数相 ...
- java 循环读取文件夹里面的文件
public ArrayList<String> list = new ArrayList<String>(0);//用arraylist保存扫描到的路径public void ...