题意:

给定初始位置,查询n次区间,每次查询前可以花费移动距离的代价来移动,

查询时需要花费当前位置到区间内最近的点的距离,求最小代价。

1<=n<=5000,1<=所有位置<=10^9

题解:

可以用O(n^2)的暴力DP碾过去…

不过实际上可以O(n)贪心。

贪心的想法是比较明显的,就是每次找最近的,需要考虑的就是移动不移动。

比如有多个连续的在当前位置左边的区间,

这时往左会让这些区间的答案都减小,而增大的代价至多是移动距离*2。

不过这样子考虑会比较麻烦,观察到这题的特点,在查询时花费代价或者移动后再查询花费代价是一样的。

所以我们可以用一个区间表示当前位置(当前答案对应的可能的位置区间)。

这样,如果查询区间完全在当前区间之外,就一定要增加代价,

代价最小就是当前区间里查询区间最近的点,然后可以更新当前区间为这个点到查询区间之间的范围。

(在这个范围内的任何一点的移动代价+查询代价都是一样的)

如果查询区间包含了当前区间,就代表当前区间的任何一点都不用增加代价。

如果查询区间与当前区间只有部分重合,那么重合部分不用增加代价,所以就把当前区间缩小到重合部分。

这样就实现了贪心。

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <cstdio>
#include <cstring>
inline int read()
{
int s = ; char c; while((c=getchar())<'0'||c>'9');
do{s=s*+c-'0';}while((c=getchar())>='0'&&c<='9');
return s;
}
int n,l,r,ql,qr;
long long ans;
int main()
{
for(n=read(),l=r=read();n--;)
{
ql = read(), qr = read();
if(ql<=l&&r<=qr) continue;
if(qr<l) ans += l-qr, r = l, l = qr;
else if(r<ql) ans += ql-r, l = r, r = ql;
else l = ql>l?ql:l, r = qr<r?qr:r;
}
printf("%I64d\n",ans);
return ;
}

最新文章

  1. LRU页面置换算法
  2. python socket
  3. java.net.URLConnectioin的http(get,post)请求(原生)
  4. SQLSERVER查询连接数
  5. bzero函数
  6. winform插入sql的事务处理
  7. 在Windows7上安装coreseek3.2同时在PHP下简单实现步骤
  8. allegro生成光绘文件时,通过cam打开,*.drl钻孔文件不识别,为Unknow类型
  9. hdoj 1262 寻找素数对
  10. css定义多重背景动画
  11. 解决Xcode6.0.1编译Unity3Dproject报错
  12. 镜像的缓存特性 - 每天5分钟玩转 Docker 容器技术(14)
  13. bootstrap 鼠标悬停显示
  14. 使用URL访问http服务器
  15. Tiny4412之按键驱动
  16. Web组件流畅拖动效果
  17. PAT A1136 A Delayed Palindrome (20 分)——回文,大整数
  18. wampserver 权限配置
  19. Apache AB的安装和使用(Ubuntu16.04)
  20. 11.Set 和 Map数据结构

热门文章

  1. SQL Server 2014新特性:其他
  2. java获取日期之间天数的方法
  3. 批量创建10个用户stu01-stu10
  4. 常用兼容浏览器js
  5. 使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)
  6. Statement对象的executeUpdate返回信息
  7. oracle add_months函数
  8. ngx_http_proxy_module模块.md
  9. JavaSript模块规范 - AMD规范与CMD规范介绍
  10. [LeetCode] String to Integer (atoi) 字符串转为整数