Fixing the Great Wall

飞牛fnNAS虚拟机标准安装 飞牛NAS是一款基于Debian开发的国产免费NAS系统,支持x86架构设备,可将闲置硬件改造为NAS服务器。系统安装简便,支持多种存储模式与硬盘休眠功能,具备智能影视管理、照片备份等实用功能,并提供多种远程访问方式。飞牛NAS还支持Docker扩展,目前已承诺永久免费。文章详细介绍了在VMware虚拟机中安装飞牛NAS的步骤,包括下载镜像、创建虚拟机、初始化设置等过程,并展示了创建共享文件夹等基本操作,帮助用户快速上手这款功能强大的免费NAS系统。 阅读详情

The Great Wall of China is truly one of the greatest wonders of the world. In 3-rd century BC, Emperor
Qin Shi Huang connected the defensive structures built earlier by the states of Qin, Yan, and Zhao
kingdoms. The purpose of the wall was to defend against raids by the barbarians from Mongolia and
Manchuria. The wall was extended and renovated in later centuries, creating an impressive 6,700 km
long fortification.
The centuries have left their mark on the wall, there are several sections that need immediate
renovation. These sections have to be repaired as soon as possible since they deteriorate every day: if
we do not fix them now, it will be more expensive to repair them later. Thus the Ministry of Monuments
have designed and built the world’s first Great Wall Automatic Repair Robot (GWARR), to repair the
damaged sections (we are in the 21-st century, aren’t we?) Your task is to write the software that will
guide the robot and decide the order in which the sections are to be repaired.
For the purpose of this problem, we assume that the Great Wall is a long straight line, and every
location on the wall is identified by a single number (say, the distance from one end). The GWARR is
placed at some location on the wall and it can move with constant speed in both directions. For each
damaged section you are given its location, how much it would cost to repair now, and how the cost
would increase if repaired later. The GWARR works so efficiently that once it is at the exact location
of the damaged section it can repair the wall immediately.
Input
The input contains several blocks of test cases. Each case begins with a line containing three integers:
an integer 1 ≤ n ≤ 1000, the number of damaged sections, an integer 1 ≤ v ≤ 100, the speed of
the GWARR in distance units/time units, and an integer 1 ≤ x ≤ 500000, the initial position of
the GWARR. The next n lines describe the n damaged sections that have to be repaired. Each line
contains three integers: the location 1 ≤ x ≤ 500000 of the section, the cost 0 ≤ c ≤ 50000 of repairing
it immediately, and 1 ≤ ∆ ≤ 50000, the increase in cost per time unit. Therefore, if the section is
repaired after t time units have passed, then we have to pay c + t∆ units of money. It can be assumed
that the locations of the sections are all different, and the initial location of the robot is not on the list
of damaged seetions.
The input is terminated by a test case with n = v = x = 0.
Output
For each test case, you have to output a line containing a single number, the minimum cost of repairing
the wall. This number should be an integer, round down the result, if necessary. It can be assumed
that the minimum cost is not more than 1000000000.
In the optimum solution for the first test case below, we first fix loeation 998 at the cost of 600,
then the location 1010 at the cost of l400, and finally we fix the location 996 at the cost of 84, giving
the total cost 2084.
Sample Input
3 1 1000
1010 0 100
998 0 300
996 0 3
3 1 1000
1010 0 100
998 0 3
996 0 3
0 0 0
Sample Output
2084
1138
一个机器人去修长城,有n个维修点,机器人移动速度为v,初始坐标为x,然后是n组维修点数据:维修点的坐标,维修这个点的固有费用,维修费用随时间的增长率。
第一反应就是区间dp,因为之前刚做过一个区间dp(Alibaba那篇博文我写了区间dp的讲解),很容易想到,然后的想法就是写两个区间dp,一个是时间Time[i][j][2],表示区间ij之间的最短时间,然后再创一个dp[i][j][2],就是ij之间的最少费用。
转移方程就是
Time[i][j][0]=min(Time[i+1][j][0]+node[i+1].x-node[i].x,Time[i+1][j][1]+node[j].x-node[i].x);
Time[i][j][0]-min(Time[i][j-1][0]+node[j].x-node[i].x,Time[i][j-1][1]+node[j].x-node[j-1].x);
value[i][j][0] = node[i].c + min(value[i + 1][j][0] + time1*node[i].dit, value[i + 1][j][1] + time2*node[i].dit);
value[i][j][1] = node[j].c + min(value[i][j - 1][0] + time3*node[j].dit, value[i][j - 1][1] + time4*node[j].dit);
time1,time2,time3,time4就是对应的时间,我直接代替了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
double extime[1005][1005][2];
double value[1005][1005][2];
struct Node{
    int x;
    int c;
    int dit;
}node[1005];
bool cmp(Node a, Node b)
{
    return a.x < b.x;
}
int main()
{
    int i, j, m, n, ans, t, v, x;
    while (scanf("%d%d%d", &n, &v, &x) != EOF)
    {
        if (!n&&!x&&!v)break;
        for (i = 1; i <= n; i++)
            cin >> node[i].x >> node[i].c >> node[i].dit;
        sort(node + 1, node + 1 + n, cmp);
        for (i = 1; i <= n; i++)
        {
            extime[i][i][1] = extime[i][i][0] = abs(x - node[i].x)*1.0 / v;
            value[i][i][0] = value[i][i][1] = node[i].c*1.0 + node[i].dit*extime[i][i][0] * 1.0;
        }
        for (i = n - 1; i >= 1; i--)
        {
            for (j = i + 1; j <= n; j++)
            {
                extime[i][j][0] = min(extime[i + 1][j][0] * 1.0 + (node[i + 1].x - node[i].x)*1.0 / v, extime[i + 1][j][1] * 1.0 + (node[j].x - node[i].x)*1.0 / v);
                extime[i][j][1] = min(extime[i][j - 1][0] * 1.0 + (node[j].x - node[i].x)*1.0 / v, extime[i][j - 1][1] * 1.0 + (node[j].x - node[j - 1].x)*1.0 / v);
            }
        }
        for (i = n - 1; i >= 1; i--)
        {
            for (j = i + 1; j <= n; j++)
            {
                double time1, time2, time3, time4;
                time1 = (node[i + 1].x - node[i].x)*1.0 / v + extime[i + 1][j][0];
                time2 = (node[j].x - node[i].x)*1.0 / v + extime[i + 1][j][1];
                time3 = (node[j].x - node[i].x)*1.0 / v + extime[i][j - 1][0];
                time4 = (node[j].x - node[j - 1].x)*1.0 / v + extime[i][j - 1][1];
                value[i][j][0] = node[i].c*1.0 + min(value[i + 1][j][0] * 1.0 + time1*node[i].dit*1.0, value[i + 1][j][1] * 1.0 + time2*node[i].dit*1.0);
                value[i][j][1] = node[j].c*1.0 + min(value[i][j - 1][0] * 1.0 + time3*node[j].dit*1.0, value[i][j - 1][1] * 1.0 + time4*node[j].dit*1.0);
            }
        }
        ans = min(value[1][n][0], value[1][n][1]);
        cout << ans << endl;
    }
    return 0;
}

但是wa掉了,看了网上的题解,发现别人都是用了一次区间dp,然后我就画了画转移,发现时间和费用的转移并不一定完全一致,意思就是在这个区间,时间最短的路线和费用最短的路线可能不一样。比如左端时间少,右端时间长,但是左端增长率非常低,右端增长率异常高,那么转移就不一样了。这样时间就不可以直接用了。
正确做法是,每走一步,算一次时间。意思就是,当前移动花费t时间,那么所有未维修的站点的费用都要增加node[i].dit*t,对于每一次的转移都是这样,其实就是把转移的时间分解,逐步增加这个维修点的费用,比如维修1,2,3站点,先修1,时间t1,再修2,时间t2,那么对于站点3,维修之前,花了t1+t2时间,先算出t1时间,再算出t2时间,加起来还是总的费用。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
double value[1005][1005][2];
int d[1005];
int n;
struct Node{
    int x;
    int c;
    int dit;
}node[1005];
bool cmp(Node a, Node b)
{
    return a.x < b.x;
}
double Cost(int l, int r, double temp)
{
    double ans = 0;
    ans = (d[n] - d[r] + d[l - 1])*1.0*temp;
    return ans;
}
int main()
{
    int i, j, m, ans, t, v, x;
    double Time;
    while (scanf("%d%d%d", &n, &v, &x) != EOF)
    {
        if (!n&&!x&&!v)break;
        for (i = 1; i <= n; i++)
            scanf("%d%d%d", &node[i].x, &node[i].c, &node[i].dit);
        sort(node + 1, node + 1 + n, cmp);
        d[0] = 0;
        d[1] = node[1].dit;
        for (i = 2; i <= n; i++)
            d[i] = d[i - 1] + node[i].dit;
        for (i = 1; i <= n; i++)
        {
            Time = abs(x - node[i].x)*1.0 / v;
            value[i][i][0] = value[i][i][1] = node[i].c*1.0 + node[i].dit*Time + Cost(i, i, Time);
        }
        for (i = n - 1; i >= 1; i--)
        {
            for (j = i + 1; j <= n; j++)
            {
                double time1, time2, time3, time4;
                time1 = (node[i + 1].x - node[i].x)*1.0 / v;
                time2 = (node[j].x - node[i].x)*1.0 / v;
                time3 = (node[j].x - node[i].x)*1.0 / v;
                time4 = (node[j].x - node[j - 1].x)*1.0 / v;
                value[i][j][0] = node[i].c*1.0 + min(value[i + 1][j][0] * 1.0 + time1*node[i].dit*1.0 + Cost(i, j, time1), value[i + 1][j][1] * 1.0 + time2*node[i].dit*1.0 + Cost(i, j, time2));
                value[i][j][1] = node[j].c*1.0 + min(value[i][j - 1][0] * 1.0 + time3*node[j].dit*1.0 + Cost(i, j, time3), value[i][j - 1][1] * 1.0 + time4*node[j].dit*1.0 + Cost(i, j, time4));
            }
        }
        ans = min(value[1][n][0], value[1][n][1]);
        printf("%d\n", ans);
    }
    return 0;
}

还要注意这个Cost函数,我之前是从1到l-1,r+1到n来计算这个未维修的增长率,会超时的,这里用了优化技巧,作为一个tips使用。
其实就是求[l,r]区间,可以求出[0,l],[0,r],这样减一下就是要求的区间了。而求这样的区间是有统一方法的。

基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266) 一、环境介绍 小车主控MCU: STM32F103ZET6 STM32程序开发IDE: keil5 STM32程序风格: 采用寄存器方式开发,注释齐全,执行效率高,方便移植 手机APP: 采用QT设计,程序支持跨平台编译运行(Android、IOS、Windows、Linux都可以编译运行,对应平台上QT的环境搭建,之前博客已经发了文章讲解) 硬件包含: 淘宝购买的完整一套4轮遥控小车(采用STM32F103ZET6作为主控板)、DHT11温湿度传感器、中科微GPS模块、ESP8266 ... 阅读详情

相关推荐

零中频架构实战:用Matlab模拟AD9361收发信号(附完整代码)

本文详细介绍了如何使用Matlab模拟AD9361射频收发器的零中频架构,解决镜像干扰等关键挑战。通过完整的代码示例和系统级建模方法,帮助工程师掌握RFIC设计中的自适应校准算法和性能优化技巧,特别适用于SDR系统开发。

weixin_30733003的博客 538

uva 1336 - Fixing the Great Wall 修缮长城

比较难想的动态规划 uva 1336 - Fixing the Great Wall 修缮长城

便纵有千种风情 933

基于深度学习的图像去雨(Opencv,Pytorch,Cnn)

最近做了一个图像去雨项目,使用的语言为Python,深度学习框架为Pytorch。去雨效果不错,具体请看效果视频!图像去雨(GAN,Opencv,Pytorch)

Czqqwer的博客 2611

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表示在...

SuperGate的博客 273

车规级非易失存储选型指南:从AEC-Q100到ISO 26262的可靠性设计

非易失存储器是电子系统中负责长期保存关键数据与代码的核心组件,其可靠性直接决定了系统的长期稳定运行能力。在汽车电子领域,这一要求被提升到了极致,必须满足严苛的车规级标准。从原理上看,存储器的数据保持能力、擦写寿命等关键参数在高温、振动等恶劣环境下会急剧衰减,因此需要专门的设计与验证。其技术价值在于保障车辆全生命周期的功能安全与数据完整性,避免因存储失效导致的安全隐患或频繁维护。应用场景涵盖从发动机控制单元、自动驾驶域控制器到智能座舱的各类电子控制单元。本文聚焦于车规级非易失存储的选型,深入解析AEC-Q10

weixin_30938149的博客 456

Rider高效调试UE引擎:无需编译源码的符号配置指南

本文提供了一份详尽的Rider高效调试UE引擎指南,核心在于无需编译源码即可配置调试符号。通过Epic启动器下载官方PDB文件,并在Rider中正确配置外部符号服务器路径,开发者能在10分钟内实现对引擎内部代码(如AActor::Tick)的源码级断点调试、变量查看和调用堆栈分析,极大提升问题排查效率。

weixin_29011239的博客 340

例题 9-21 修缮长城(Fixing the Great WALL, ACM/ICPC CERC 2004, UVa1336)

原题链接:https://vjudge.net/problem/UVA-1336 分类:区间DP 备注:记忆化搜索 注意一定要加floor,否则会WA。 #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 1010; struct Node { double x, c, d; bool operator < (const Node& rhs) const {

TK_wang_的博客 337

Win11下Python脚本不执行?5分钟搞定PATH环境变量配置(VSCode终端实测)

本文针对Win11系统下VSCode终端中Python脚本执行无响应的问题,提供了详细的诊断与解决方案。核心在于正确配置PATH环境变量,通过图形化界面调整Python路径优先级,并分享了VSCode终端环境变量的刷新技巧,帮助开发者在5分钟内快速解决环境配置难题。

weixin_28358083的博客 384

1336 - Fixing the Great Wall(DP)

本题极为经典,是动态规划中“未来费用”的计算, 因为起点固定且维修时间忽略,所以任意时间已经修复的点一定是一个连续的区间 。因此我们用d[i][j][k]表示已经修理完区间[i,j] 且现在正在点k ,如果k为0,在i点,如果k为1,在j点。这显然已经可以表示所有状态,那么怎么维护时间这个量呢?  我们可以发现,每过t时间,没有维修的点都将增加费用,所以我们不妨先预处理求出每个区间的d值只和,然

AC_Arthur的专栏 1739

CircuitBreaker Resilience4J 介绍

在分布式环境中,我们的应用可能会面临着各种各样的可恢复的异常(比如超时,网络环境异常),此时我们可以利用不断重试的方式来从异常中恢复(Retry Pattern),使整个集群正常运行。然而,也有一些异常比较顽固,突然发生,无法预测,而且很难恢复,并且还会导致级联失败(举个例子,假设一个服务集群的负载非常高,如果这时候集群的一部分挂掉了,还占了很大一部分资源,整个集群都有可能遭殃)。如果我们这时还是不断进行重试的话,结果大多都是失败的。

zzhongcy的专栏 3539

基于Python的电商平台商品信息爬取与价格监控系统设计与实现

本文详细介绍了一个基于Python的电商平台商品信息爬取与价格监控系统的设计与实现。系统采用最新的Python爬虫技术栈,包括Scrapy框架、Selenium自动化测试工具、BeautifulSoup解析库等,实现了对主流电商平台商品信息的自动化采集、存储、分析和可视化展示。文章从系统架构设计、关键技术实现、核心代码解析等方面进行了全面阐述,并提供了完整的代码实现。该系统不仅适用于毕业设计,也可作为商业价格监控系统的原型。关键词:Python爬虫;电商数据采集;价格监控;Scrapy;Selenium;

2201_76125261的博客 963

UVALive 3181 Fixing the Great Wall

题目大意:现在长城上有n个点要修,每个点有三个属性,x、c、d,x表示位置,其他两个表示如果在 t 时刻修它,那么费用就是 c + t*d,修理点不占时间。有一个人要去修这些点,现在告诉你n、它的速度v、起始位置s,问你总的最小费用。 思路:这道题的关键地方有两个:(1)由于修理不占时间,那么时间全花在走路上,对于某一个区间,最小费用情况下,他修理完这些点的最终的位置肯定是两个端点其中之一。(2

沉溺的专栏 1953

Allegro 给元器件PCB封装库添加3D模型详细步骤

从上面视图可以看到模型跟PCB 库的方向是对了,但是位置偏下,且在PCB封装库后面,我们下面需要做的就是把模型往上移、往前移。首先将元器件3D模型文件放在封装库的目录下(也可以单独新建一个模型库文件夹),注意3D文件必须是Step格式。Transparent: 选择透视的对象,可以是模型、也可以是PCB封装,或者两种都透视。在左边搜索要添加的3D模型的文件(注意是在* 星号前面输入文件名),按回车即可找到。同样的,接下来需要往Y 负方向移,即左移,一边调整一边观察视图。

sinat_15677011的博客 3679

【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...

IDDFS 268

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

UVa 1336 Fixing the Great Wall

本文介绍了一个区间动态规划算法,用于解决长城修复机器人路径规划问题。该问题要求确定损坏区段的最优修复顺序,以最小化随时间增长的总修复成本。算法通过将机器人初始位置作为虚拟起点,使用两个动态规划数组分别记录停在区间两端的状态,并计算移动时间和累积成本。关键步骤包括区段排序、前缀和计算、区间动态规划状态转移,最终输出最小成本。该算法的时间复杂度为O(n²),适用于中等规模的问题实例。

寂静山林 690

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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 输出 修补花费,截断输出整数 思路 修复的点...

zpf1998的博客 238

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Fixing the Great Wall UVA - 1336

简单的题目,按照紫书上面的思路即可,但是在实现的过程当中又感觉到了一丝丝贪心算法的味道,嗯,有一定的违和感...... #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespa

zju2016的博客 347

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)$表示从$...

weixin_30412013的博客 119

【Uva 1336】Fixing the Great Wall

【Link】: 【Description】 给你长城上的n个修补点,然后你的位置为x; 你需要依次去这n个点,然后把它们全部修好. 但是修的前后顺序不一样的话,花费不一样. 如果立即把第i个点修好的话,需要c[i]点花费; 每多t秒钟,就要多花费t*d[i]点花费. 你一开始的位置在x,然后你的移动速度为v; 求修完所有的点的最小花费. 【So...

91

Linux进程间通信:消息队列与信号灯的原理、API实战与高级应用

进程间通信(IPC)是操作系统实现多进程协同工作的核心技术,它解决了进程间数据交换与同步控制的基础问题。其核心原理在于通过内核提供的机制,在隔离的进程地址空间之间建立可控的数据通道或同步点。从技术价值看,IPC是构建高性能、可扩展后台服务与分布式系统的基石,直接影响系统的稳定性与吞吐量。在应用场景上,它广泛服务于生产者-消费者模型、资源池管理、任务分发等并发模式。本文将聚焦于System V IPC家族中的两个经典实现:消息队列与信号灯(信号量)。消息队列提供了异步、结构化的消息传递能力,有效解决了进程间数

weixin_30719711的博客 364

Blocks && Fixing the Great wall

读完大概都能发现是dp 方法都很套路 首先第一个题每次取的是一段区间,就能够想到区间dp 按照区间dp的模板能够想到一种裸的方法: \(dp[i][j]\) 表示处理完 \([i...j]\) 的最大分数 然后你会发现这种方法连样例1都不能搞定 因为 \(dp[i][j]\) 可能受到后面一些同色块的影响,导致直接处理不能获得最优值 那怎么办? 哪有问题就解决哪里 添加一位 \(k\),...

weixin_30642869的博客 87

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则在

Circus 596

UVA1336 - Fixing the Great Wall

区间DP

ACoder 403
上一篇: Longest Run on a Snowboard
下一篇: Flow Problem
Techay
博客等级 码龄11年 11粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值