//
// main.cpp
// uva 1336 - Fixing the Great Wall
/*
我们先按位置大小排序。
首先我们注意到:
对于 i ....x.....j,x表示现在的机器人的位置。
如果x现在在修复了i,那么位于x和i之间的所有位置都是已经修复好的了,因为我们当前已经到了i,那么我们就可以顺便修复了x和i之间的位置,这绝对不会增加最终的总费用。所以得出了一个结论。
最优的修复顺序满足,1---x之间的位置在最优解中的相对位置是相反的。而x---n之间的位置的相对位置是不变的。
有了这个结论我们可以想到解法了.
对于当前的位置我们有两个选择 1.修复当前位置右边的位置。
2.修复当前位置左边的位置。
设d[i][j][t]表示当前所在的位置为t,(t等于i或者j),且只考虑前i个,和第j个以及后面的位置,修理后面被破坏的区域需要的最少的钱。
这里t只为1或者0.0表示在左边,1表示字右边的节点上。
则有
d[i][j][0] = min(d[i][j][0] , d[i-1][j][0]+t[i-1][i] * c_all[i-1][j],d[i-1][j+1][1] + t[j][j+1]* c_all[i-1][j+1]);t[i][j]表示从i到j的时间。
同理可得出在t==1时的情况。
*/
#include <iostream>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
#define ll long long
using namespace std ;
double d[1010][1010][2];
double v ;
double INF = 1000000000 ;
int c_all[1010][1010] ;
struct sec{
int pos , c,d ;
bool operator < (const sec &temp ) const{
return pos < temp.pos ;
} ;
};
sec wall[1010] ;
int n ;
double min(double a,double b)
{
return a >b ? b :a ;
}
double dp(int l , int r , int t)
{
if (d[l][r][t] >= 0 ) {
return d[l][r][t] ;
}
else{
double time ;
double& ans = d[l][r][t] ;
ans = INF ;
if (t == 0 ) {
if (l <= 1&& r == n + 1) {
return ans = 0 ;
}
if(l >1) {
time =((double )(wall[l].pos - wall[l-1].pos))/v ;
ans = min(ans , dp(l-1,r , 0) + time * c_all[l-1][r]) ;
}
if(r <=n ) {
time = ((double) (wall[r].pos - wall[l].pos))/v ; ;
ans = min(ans , dp(l-1, r, 1) + time * c_all[l-1][r]) ;
}
}
else{
if (l == 0 && r == n ) {
return ans = 0 ;
}
if(l >=1){
time =((double )(wall[r].pos - wall[l].pos))/v ;
ans = min(ans , dp(l,r+1 , 0) + time * c_all[l][r+1]) ;
}
if(r <n ){
time = ((double) (wall[r+1].pos - wall[r].pos))/v ; ;
ans = min(ans , dp(l, r+1, 1) + time * c_all[l][r+1]) ;
}
}
return ans ;
}
}
int sum[1010] ;
int main() {
int x,_v;
double ans ;
int cost ;
while (scanf("%d%d%d" ,&n,&_v,&x)==3 && n + _v + x != 0 ) {
cost = 0 ;
for (int i = 0; i < n ; i++) {
scanf("%d%d%d" ,&wall[i+1].pos,&wall[i+1].c,&wall[i+1].d) ;
cost += wall[i+1].c ;
}
sort(wall+1, wall+n+1) ;
for (int i = 0; i <=n+5; i++) {
for (int j = 0 ; j <= n +5; j++) {
d[i][j][0] = d[i][j][1] = -1 ;
}
}
sum[0] = 0 ;
for (int i = 1; i <= n ; i++) {
sum[i] = sum[i-1] + wall[i].d ;
}
for (int i = 0; i <= n ; i++) {
for (int j = i+1 ; j <=n; j++) {
c_all[i][j] = sum[i] + sum[n] - sum[j-1] ;
}
c_all[i][n+1] = sum[i] ;
}
int s = 1 ;
while (s <= n && wall[s].pos < x) {
s++ ;
}
v = _v ;
if (s == 1) {
ans = dp(1, 2, 0) +(double(wall[1].pos - x) )/v*sum[n] ;
}
else if (s ==n +1 )
{
ans = dp(n, n+1,0) + (double(x- wall[n].pos) )/v*sum[n];
}
else{
ans = min(dp(s-1, s , 0 ) +(double(x- wall[s-1].pos) )/v*sum[n] ,
dp(s-1, s , 1 ) +(double( wall[s].pos-x) )/v*sum[n]);
}
printf("%d\n" ,(int)(ans + 1e-8 +cost)) ;
}
return 0;
}
相关推荐
基于DSP28335的Matlab/Simulink代码生成实验七:A/D采样
实验七:讲解如何使用DSP的ADC模块,通过代码生成技术控制DSP进行电流采样,是后续实现电机闭环控制的重要环节。通过简单的实验来熟悉代码生成的过程。最终实现复杂算法代码自动生成,进行高性能电机控制!
UVA1336 - Fixing the Great Wall (区间DP)
题意:用机器人修复分布在一条直线段上的n个损坏点,对于每个点i,x[i]表示位置,c[i]为立刻修缮的费用,d[i]为单位时间增加的维修费用。例如若在时刻t修缮i号点,则费用为ci+t∗di。给出机器人的初始位置x,速度v。求出修缮所有点的最小费用。 分析:在任意时刻,机器人修完的点肯定是一个连续的区间,这个区间的费用不会再增加,它接下来每移动一步,增加的费用都等于区间外的d之和乘以时间。f[i...
解放双手,摆脱自建库的繁琐,立创EDA元件库转cadence原理图封装库实战技巧
解放双手,摆脱自建库的繁琐,立创EDA元件库转cadence原理图封装库实战技巧
Uva-1336-Fixing the Great Wall
这个题大意是给你一些需要修复位置的坐标,以及修复他们的费用和等待单位
NB-IoT开发避坑指南:STM32下AT指令状态机的设计与优化
本文深入探讨了在STM32平台上为NB-IoT模组开发时,如何用状态机(FSM)设计替代传统的阻塞式AT指令处理方法。通过构建非阻塞、事件驱动的AT指令引擎,有效解决了系统卡顿、响应迟缓等问题,并详细介绍了状态机的设计、实现与高级优化技巧,助力开发者打造健壮可靠的物联网设备通信核心。
Unity3D用c#脚本调用前端javascript函数:H5获取unity - webgl 加载并初始化完成的消息
unity3d发布的Webgl 可以作为静态文件加载到H5页面中,并通过javascript 调用unity内置的C#脚本函数,详见Webgl调用unity api。而往往我们需要知道Webgl ready的消息,本文将给出unity 内部调用javascript函数的方案加以解决。
UVA1336 - Fixing the Great Wall
区间DP
python 中心线提取_二值分析 | OpenCV + skimage如何提取中心线
点击上方蓝字关注我们微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识问题前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:怎么得到白色Blob中心线,他希望的效果如下:显然OpenCV中常见的轮廓分析无法获得上面的中心红色线段,本质上这个问题是如何提取二值对象的骨架,提取骨架的方法在OpenCV的扩展模块中,另外skimage包也支持图像的骨架提取。这里就...
一个不错的笑話哦⋯⋯很有意思的双关语
amlaosong评:这是IT行业两个大佬的对话,一个在人间,一个在天堂,对话以盖茨问乔布斯天堂情况开始: An intelligent joke. Bill Gates: "So, how's heaven, Steve?" Steve Jobs: "Great ! It just doesn't have any wall or fence." Bill Gates: "So...?"
Embarcadero Dev-C++ 6.3安装教程【保姆级】
Embarcadero Dev-C++ 6.3安装教程,保姆级教程~
32、高光谱遥感技术在军事领域的应用解析
高光谱遥感技术凭借其高分辨率和精细光谱分析能力,在军事领域广泛应用于战场详细侦察、伪装目标识别及目标实际温度与发射率的检测,显著提升了目标识别精度和作战支持能力。同时,该技术在内陆水体成分反演、海洋环境监测和农业管理等领域也展现出巨大潜力。尽管面临数据量大、处理复杂、技术融合不足和仪器性能限制等挑战,未来通过人工智能融合、高效算法研发和先进仪器开发,高光谱遥感技术将在多领域实现更深入应用与发展。
uva 1336 - Fixing the Great Wall 修缮长城
比较难想的动态规划 uva 1336 - Fixing the Great Wall 修缮长城
【入坑存内计算一键指南】存内计算运算原理:算法优化、存储介质探究
本文探讨了存内计算及其面向的架构优化,尤其侧重于图算法优化和存内计算存储介质。文章介绍了存内计算的概念和意义,着重强调了存内计算解决了内存墙问题,提高了计算效率。针对图算法的优化,提出了基于位运算的创新方法,重塑了单源最短路径算法,并介绍了基于局部重叠度的链路预测算法优化设计。接着,文章详细讨论了存内计算存储介质,特别是非易失性存储器,比较了不同类型存储器的性能,并重点介绍了基于ReRAM的存内计算技术,包括其物理模型和交叉阵列结构。
UVa 1336 Fixing the Great Wall
本文介绍了一个区间动态规划算法,用于解决长城修复机器人路径规划问题。该问题要求确定损坏区段的最优修复顺序,以最小化随时间增长的总修复成本。算法通过将机器人初始位置作为虚拟起点,使用两个动态规划数组分别记录停在区间两端的状态,并计算移动时间和累积成本。关键步骤包括区段排序、前缀和计算、区间动态规划状态转移,最终输出最小成本。该算法的时间复杂度为O(n²),适用于中等规模的问题实例。
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
uva1336 Fixing the Great Wall
https://vjudge.net/problem/UVA-1336 显然最佳的移动方式一定是向左走一段,向右走一段,再向左走一段,再向右走一段......(或者反过来) 无论如何中间的会最先被修理好,所以考虑区间dp $f_{i,j,0/1}$表示修理好了$i\rightarrow j$时,所用的最小费用(注意费用提前计算) 预处理处$cl_{i,j}(i\leq j)$表示从$...
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
UVa1336 Fixing the Great Wall
UVa1336 - vjudge 题目大意 用机器人修复分布在一条直线段上的n个坏点,对于每个点i,x[i]表示位置,c[i]为立刻修缮的费用,d[i]为单位时间增加的维修费用。例如若在时刻t修缮i号点,则费用为ci+t∗dic_i + t * d_i。给出机器人的初始位置x,速度v。求出修缮所有点的最小费用。 题解 f[i][j][k]为修复完i~j,当前位置在k(k为0则在x[i],为1则在
复分析 阿尔福斯(Ahlfors) 第三版答案 英文
答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案
【UVa】【DP】1336 Fixing the Great Wall
UVa 1336 Fixing the Great Wall 题目 ◇题目传送门◆(由于UVa较慢,这里提供一份vjudge的链接) ◇题目传送门(vjudge)◆ 题目大意 长城被看做了一条直线段。其中有NNN个点需要使用机器人维修。可以使用一个三元组(xi,ci,di)(xi,ci,di)(x_i,c_i,d_i)描述第iii个损坏点的参数,其中,xixix_i...
UVA - 1336 Fixing the Great Wall
问题 机器人修补长城,给三个整数,n代表缺口(缺口看作点),v(机器人行动速度),x(机器人现在所在位置),x不和任何缺损点重合,对于n个点,每个点有3个整数,x代表缺损点位置,c代表修补代价,delta代表随时间增加的代价,总代价是c+delta*t 输入 三个整数,n,v,x,后面n组点的参数,x,c,delta,最小花费不大于1e91e^91e9 输出 修补花费,截断输出整数 思路 修复的点...
Fixing the Great Wall UVA - 1336
简单的题目,按照紫书上面的思路即可,但是在实现的过程当中又感觉到了一丝丝贪心算法的味道,嗯,有一定的违和感...... #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespa
UVA 1336 Fixing the Great Wall(区间DP)
题意:修长城n个损坏点
【Uva 1336】Fixing the Great Wall
【Link】: 【Description】 给你长城上的n个修补点,然后你的位置为x; 你需要依次去这n个点,然后把它们全部修好. 但是修的前后顺序不一样的话,花费不一样. 如果立即把第i个点修好的话,需要c[i]点花费; 每多t秒钟,就要多花费t*d[i]点花费. 你一开始的位置在x,然后你的移动速度为v; 求修完所有的点的最小花费. 【So...
Linux进程间通信:消息队列与信号灯的原理、API实战与高级应用
进程间通信(IPC)是操作系统实现多进程协同工作的核心技术,它解决了进程间数据交换与同步控制的基础问题。其核心原理在于通过内核提供的机制,在隔离的进程地址空间之间建立可控的数据通道或同步点。从技术价值看,IPC是构建高性能、可扩展后台服务与分布式系统的基石,直接影响系统的稳定性与吞吐量。在应用场景上,它广泛服务于生产者-消费者模型、资源池管理、任务分发等并发模式。本文将聚焦于System V IPC家族中的两个经典实现:消息队列与信号灯(信号量)。消息队列提供了异步、结构化的消息传递能力,有效解决了进程间数
UVA1336 Fixing the Great Wall 区间DP
参考博客:https://www.luogu.org/problemnew/solution/UVA1336 思路: 我们先贪心的思考,选取的每些数必定是一段连续的区间,于是问题就转化成了区间DP。 按照坐标排一下序,(有一点离散化的思想吧,毕竟坐标太大)。每一个位置有两种决策方案,向左走or向右走(这里的走是指走到点,不是一个一个坐标的移动)。 我们不妨设f[i][j][k]表示在i到j...
UVA - 1336 Fixing the Great Wall(经典区间DP)
传送门 这样的题目见过几次了,给出起点,遍历若干坐标,每次既可以向左走又可以向右走,每个点对应权值函数,然后找一个最优的走法 1.首先需要想到的一点是,因为修理某点不耗费时间,所以假如下一个点是对应需要修理的最优点,那么从当前点到下一个最优点的路途中,可以顺便修理中间的点,那么这样就是最优花费。那么我们在修理过程中,已修理的区间一定是连续的,那么考虑区间dp 2.因为不知道当前时间,因此费用不能在到达某点时再计算,而是事先将肯定会发生的费用累加到答案中,然后“时钟归零”。对于所有区间显然需要按坐标排序,这
UVA1336 Fixing the great wall
题目大意:将长城看成一直线段,有n个需要修缮的点。对于第i个点用三个参数x,c,d表述。x表示位置,c表示立即修缮的费用,d表示单位时间增加的修缮费用。修缮时间忽略不计。机器人初始位置在x处,移动速度恒定为v,找到修缮所有点的最小费用 将所有点按照位置排序。由于修复的点一定是一段连续的区间,因此我们可以考虑用区间dp解决 f[i][j][k]表示修复i~j区间所有点最终停在k点时(k=0表示在...
4724



被折叠的 条评论
为什么被折叠?



