【noip模拟】修长城
Time Limit: 1000ms Memory Limit: 256MB
Description
大家都知道,长城在自然条件下会被侵蚀,因此,我们需要修复。现在是21世纪,修复长城的事情当然就交给机器人来干辣。我们知道,长城每时每刻都在受到侵蚀,如果现在不修复,以后修复的代价会更高。现在,请你写一个程序来确定机器人修长城的顺序,使得修复长城的代价最小。
在这道题中,我们认为长城是一条很长的线段,长城的每个位置都有唯一的数字与它对应(即当前位置到长城某一端的距离)。这台机器人开始被放在一个给定的初始位置,并以一个恒定的速率行驶。对于每个损坏的地方,你都知道它具体的位置、现在修复的代价、以后修复代价会怎么增加。由于机器人效率特别高,机器人每到损坏的地方就能瞬间将该位置修复。
Input
第一行三个整数 $n,v,x(1≤n≤1000,1≤v≤100,1≤x≤500000)$ ,分别表示长城损坏地方的数目、机器人在1个单位时间内移动的长度、机器人的初始位置。
接下来n行,每行三个整数 $x,c,u(1≤x≤500000,0≤c≤50000,1≤u≤50000)$ 。x代表损坏地方的位置。如果立即修复,则该损坏位置修复的代价为c。如果选择在t时刻后修复,则该损坏位置修复的代价为c+u*t。数据保证所有损坏的位置都是不同的,机器人刚开始不会站在损坏的位置上面。
Output
输出只有一个整数,修复整个长城的最小代价(如果是小数,则向下取整)。
对于下面第一组样例的解释:
首先去998位置修复,费用为600。
然后去1010位置修复,费用为1400。
最后去996位置修复,费用为84。
最终答案为2084。
Sample Input
【样例输入1】
3 1 1000
1010 0 100
998 0 300
996 0 3
【样例输入2】
3 1 1000
1010 0 100
998 0 3
996 0 3
Sample Output
【样例输出1】
2084
【样例输出2】
1138
HINT
对于10%的数据,$ n≤10$
对于20%的数据, $n≤20$
对于50%的数据, $n≤100$
对于100%的数据,$n≤1000$
[吐槽]
最近各种脑抽。。于是乎仿佛是完全不会dp了qwq
[题解]
显然那个维修的初始值是一点用都没有的最后再加上就好了
然后只用看其他的东西
首先有一个比较重要的性质
修补过的肯定是一个连续的区间
那么考虑一个$n^2$的dp
$f_{i,j}$表示已经修完了$x_i$到$x_j$这段区间,并且停在$x_i$的时候,要修补完剩下区间的最小花费
$g_{i,j}$表示(同上),并且停在$x_j$的时候,要修完剩下区间的最小花费
这样就可以直接加了呀每次就加上这段移动需要的花费,式子就很好推了
那么再引入两个定义
$s1_i$表示的是花费的前缀和
$s2_i$表示的是花费的后缀和
那么就有
$f_{i,j}=min(f_{i-1,j}+(x_{i+1}-x_{i})*(s1_{i}+s2_{j+1}),g_{i+1,j}+(x_{j}-x_{i})*(s1_{i}+s2_{j+1}))$
$g_{i,j}=min(g_{i,j-1}+(x_{j}-x_{j-1})*(s1_{i-1}+s2_{j}),f_{i,j-1}+(x_{j}-x_{i})*(s1_{i-1}+s2_{j]})$
同时还有从$g$走到$f$和从$f$走到$g$的,也就是
$f_{i,j}=min(f_{i,j},g_{i,j}+(x_j-x_i)*(s1_{i-1}+s2_{j+1}))$
$g_{i,j}=min(g_{i,j},f_{i,j}+(x_j-x_i)*(s1_{i-1}+s2_{j+1}))$
相互影响?
仔细想一下就会发现如果相互影响的话就不会用来更新了
所以没有关系
然后就很玄妙滴搞完啦ovo
[一些细节]
long long 没啦qwq
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Min(x,y) x<y?x:y
#define ll long long
using namespace std;
const int MAXN=;
struct data
{
int x,w,c;
}a[MAXN];
ll f[MAXN][MAXN],g[MAXN][MAXN];
ll s1[MAXN],s2[MAXN];
int n,m,st;
ll ans;
bool cmp(data x,data y) {return x.x<y.x;}
int abs1(int x) {return x>?x:-x;} int main()
{
// freopen("a.in","r",stdin); scanf("%d%d%d",&n,&m,&a[].x);
for (int i=;i<=n;++i)
scanf("%d%d%d",&a[i].x,&a[i].c,&a[i].w),ans+=a[i].c;
sort(a+,a++n,cmp);
for (int i=;i<=n;++i) s1[i]=s1[i-]+a[i].w;
for (int i=n;i>=;--i) s2[i]=s2[i+]+a[i].w;
memset(f,0x7f,sizeof(f));
for (int i=;i<=n;++i) f[i][i]=g[i][i]=abs1(a[i].x-a[].x)*s1[n];
for (int i=n;i>=;--i)
for (int j=i+;j<=n;++j)
{
f[i][j]=Min(f[i+][j]+(a[i+].x-a[i].x)*(s1[i]+s2[j+]),g[i+][j]+(a[j].x-a[i].x)*(s1[i]+s2[j+]));
g[i][j]=Min(g[i][j-]+(a[j].x-a[j-].x)*(s1[i-]+s2[j]),f[i][j-]+(a[j].x-a[i].x)*(s1[i-]+s2[j]));
f[i][j]=Min(f[i][j],g[i][j]+(a[j].x-a[i].x)*(s1[i-]+s2[j+]));
g[i][j]=Min(g[i][j],f[i][j]+(a[j].x-a[i].x)*(s1[i-]+s2[j+]));
}
ans+=(ll)f[][n]/m;
printf("%lld\n",ans);
}
挫挫滴代码
【noip模拟】修长城的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- LNMP搭建02 -- 编译安装Nginx
[编译安装Nginx] 为了顺利安装Nginx,先安装下面这些: [CentOS 编译 nginx 前要做的事情] yum install gcc gcc-c++ kernel-devel yum ...
- LNMP搭建01 -- 编译安装MySQL 5.6.14 和 LNMP相关的区别
[编译安装MySQL 5.6.14] [http://www.cnblogs.com/xiongpq/p/3384681.html ] [mysql-5.6.14.tar.gz 下载] http:/ ...
- 使用scp从远程服务器下载文件到本地
[下载远程文件到本地] scp -P 6008 root@192.168.1.123:/usr/data/1.zip /Users/abc/www [上传本地文件到远程] scp -P 6008 ...
- ps通道抠章
1. 打开图片 2. 使用椭圆形选框工具,选择章所在范围(ALT+SHITF+鼠标左键) 3.复制图层(CTRL+J)为图层1,隐藏背景 4.进入通道,选择对比度最大的通道,复制通道副本 5.反选(C ...
- 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码
洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...
- Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8387752.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- linux 命令:tr 的简单使用
工作的需要,用到了tr命令,因为用到的次数不是很多,怕以后忘记了百度,就自己总结下.例子什么的,copy linux shell 脚本攻略这本书. tr:常用选项 -c 用字符串1中字符集的补集替换此 ...
- 编程中&和&&的区别
逻辑电路中用&: 与门电路,全真为真,有假为假. 编程中:&表示取地址符(C)和 按位与(非bool类型时,转换成二进制,按位与运算). &&表示逻辑与运算,& ...
- C语言老司机学Python (二)
标准数据类型: 共6种:Number(数字),String(字符串),List(列表),Tuple(元组),Sets(集合),Dictionary(字典) 本次学习主要是和数据类型混个脸熟,知道每样东 ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...