[洛谷 P4612][COCI 2011-2012#7] Setnja
TM :setnja (1S256M)
一个人要散步去会见他的 N 个朋友(按给定的顺序会见)。我们可以理解成他们都住在一个
很大的网格内,每个朋友住其中的一个单元格,所有人每一步都可以走到相邻的八个格子中。
每个朋友最多可以走 P 步与他相见,每个人的 P 值不一定相同。他可以决定起点和终点。
问他会见完所有朋友的最少步数。
输入:
第一行,一个正整数 N (2 ≤ N ≤ 200 000),表示朋友个数。
接下来,N 行,描述 N 个朋友,x, y, and P (0 ≤ x, y, P ≤ 200 000),x,y 表示朋友最初的坐
标。朋友给的顺序就是他要依次会见的顺序。
输出:
一个数,表示他要走的最少的步数。
Scoring
30%的数据,所有数字最多 20.
另有 30%的数据,所有朋友的 P 值小于 10.
样例:
Input
3
3 10 2
8 4 2
2 5 2
output
4
input
4
3 3 5
7 11 5
20 8 10
30 18 3
output
19
样例 1,从 (4, 8),出发会见第一个朋友。走两步在(6,6)会见第二个朋友,走两步到(4,5)会见第三个朋友。
代码 :
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
;
;
struct size_ {
int x1, x2, y1, y2;
size_ () {}
size_ (int x1, int x2, int y1, int y2) : x1(x1), x2(x2), y1(y1), y2(y2) {}
}c[N];
size_ cmp(size_ a, size_ b) {
size_ w(max(a.x1, b.x1), min(a.x2, b.x2), max(a.y1, b.y1), min(a.y2, b.y2));
if( w.x1 > w.x2 || w.y1 > w.y2) return size_ (-inf, -inf, -inf, -inf);
return w;
}
int n;
int main() {
freopen("setnja.in", "r", stdin);
freopen("setnja.out", "w", stdout);
scanf("%d", &n);
, x, y, p; i <= n; i ++)
scanf("%d%d%d", &x, &y, &p), c[i] = size_(x-p, x+p, y-p, y+p);
size_ w = c[];
long long ans = 0ll; // 开 long long ,不然会炸
; i <= n; i ++) {
size_ t = cmp(w, c[i]);
if( t.x1 != -inf) { w = t; continue ;}
int x = max(max(w.x1 - c[i].x2, c[i].x1 - w.x2), max(w.y1 - c[i].y2, c[i].y1 - w.y2));
// printf("%d %d<< \n", x, i); // de bug
w = cmp(size_(w.x1-x, w.x2+x, w.y1-x, w.y2+x), c[i]); ans += (long long)x;
}
printf("%lld", ans);
;
}
时间较短,博主考试炸了要改题,为什么这么做后2天找时间补上
开始填坑......
惯例 设 struct---- C[ ] { x1, x2(横坐标 x1 < x2), y1, y2(纵坐标 y1 < y2) } ( 表示那个 基♂友最多愿意活动的范围)
因为他必须按顺序访问节点,所以贪心去找就 ojbk......
首先
我们考虑样例1(我觉得结合样例更容易说清)

图中 A B C 表示 这位死宅的基♂友的初始位置, 周围的矩形表示他的基♂友愿意活动的范围......
因为我们可以选定初始位置,所以起点应该在A矩形内的任意位置(当前), 如果在矩形外的话一定不是最优解(很容易YY到),那么从A矩形到B矩形的最短距离便是从A访问B的最短距离
可以看到,最短距离便是FP,(因为可以斜着走,FQ不够长,到不了);
今天先填到这......
前面在说什么不太记得清了,能看就看,重新整理下
每个人能到达的范围可以用一个矩形来表示(显然), 第一次的位置一定是在第一个人活动的区域(如果在区域外那么他将先走到区域内在走到第二个人那里去,显然不是最优);
然后(1 ) 如果第二个点的范围与第一个点有交集,那么初始可行位置一定是在这个交集里面(YY下就好了);
(2 ) 如果第二个点的范围与第一个点无交集,那么需要移动的距离一定是第一个矩形与第二个矩形之间的最短距离,那么将第一个矩形扩大最短距离个单位,与第二个矩形的交集便是最优解可能的位置,此时 ans 加上之前求出的最短距离。
然后我们得出的最优解的范围与之后的点进行同样的操作,贪心即可得出最优解......
至于为什么......看图......

第一次我们得出1与2的最短距离是2,则最优范围从ABCD变道EM,然后再由EM去扩展得到2与3 的最优范围。(还不理解就自己画画图);
然后历时2天的坑就填完了......

[洛谷 P4612][COCI 2011-2012#7] Setnja的更多相关文章
- [SinGuLaRiTy] COCI 2011~2012 #2
[SinGuLaRiTy-1008] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 测试题目 对于所有的题目:Time Limit:1s ...
- 洛谷P4312 [COCI 2009] OTOCI / 极地旅行社(link-cut-tree)
题目描述 不久之前,Mirko建立了一个旅行社,名叫“极地之梦”.这家旅行社在北极附近购买了N座冰岛,并且提供观光服务. 当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间.Mi ...
- [洛谷P5190][COCI 2010] PROGRAM
题目大意:给你$k(k\leqslant10^6)$个数,$f(x)$表示$x$的约数在$k$个数中出现的次数,在这任何数都是$0$的约数.$m(m\leqslant10^6)$次询问,每次给出$l, ...
- [洛谷P4312][COCI 2009] OTOCI / 极地旅行社
题目大意:有$n(n\leqslant3\times10^4)$个点,每个点有点权,$m(m\leqslant3\times10^5)$个操作,操作分三种: $bridge\;x\;y:$询问节点$x ...
- 洛谷 P2260 [清华集训2012]模积和 || bzoj2956
https://www.lydsy.com/JudgeOnline/problem.php?id=2956 https://www.luogu.org/problemnew/show/P2260 暴力 ...
- 洛谷 P4149 [ IOI 2011 ] Race —— 点分治
题目:https://www.luogu.org/problemnew/show/P4149 仍然是点分治: 不过因为是取 min ,所以不能用容斥,那么子树之间就必须分开算,记录桶时注意这个: 每次 ...
- 洛谷 P1312 [ NOIP 2011 ] Mayan游戏 —— 搜索+模拟
题目:https://www.luogu.org/problemnew/show/P1312 还是不擅长这种题,所以参考了一下TJ: 其实也很好搜,按字典序,先搜右移,再搜左移: 不交换相同颜色的两个 ...
- 洛谷 P3515 [ POI 2011 ] Lightning Conductor —— 决策单调性DP
题目:https://www.luogu.org/problemnew/show/P3515 决策单调性... 参考TJ:https://www.cnblogs.com/CQzhangyu/p/725 ...
- 洛谷P2260 [清华集训2012]模积和(容斥+数论分块)
题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include< ...
随机推荐
- day63-webservice 01.cxf介绍
CXF功能就比较强了.CXF支持soap1.2.CXF和Spring整合的非常密切.它的配置文件基本就是Spring的配置文件了.CXF是要部署在服务器才能用的.CXF得放到Web容器里面去发布.CX ...
- layer使用总结一配置
导入layer.js文件即可,必须先导入jquery.js文件,因为layer是基于jquery 版本匹配,在此记录一下,layer使用1.8下载时是2.3的版本,对应的jquery使用1.8.3版本 ...
- C++——多线程
1.多进程和多线程:进程是一个总任务,一个进程可能包含多个线程. 2.并行和并发: 并发的关键是你有处理多个任务的能力,不一定要同时. 并行的关键是你有同时处理多个任务的能力. 3.共享数据的管理和线 ...
- Flask框架 之 路由和视图详解
路由+视图 我们之前了解了路由系统是由带参数的装饰器完成的. 路由本质:装饰器和闭包实现的. 路由设置的两种方式 来看个例子. @app.route('/index') def index(): re ...
- win7桌面鼠标右键过慢的解决方案
由于Intel显卡驱动在桌面右键的加载项造成.解决方案:清理注册表中桌面右键加载项,点击开始,输入regedit,找到HKEY_CLASSES_ROOT\Directory\Background\sh ...
- Java 线程不安全问题分析
当多个线程并发访问同一个资源对象时,可能会出现线程不安全的问题 public class Method implements Runnable { private static int num=50; ...
- 为docker设置国内镜像
docker的默认镜像(https://hub.docker.com/)地址,拉取镜像时是比较慢的,经常会超时,有时拉取几个小时.为了加快拉取的时间和速度,需要添加中国的镜像地址: 国内的加速地址: ...
- 软工作业1:wc.exe项目开发(java)
Github地址:https://github.com/Zzhaomin/learngit 项目相关要求 : wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个 ...
- Castle Windsor 注册组件
1.逐个注册组件即对每个接口通过代码指定其实现类,代码: container.Register( Component.For<IMyService>() //接口 .Implemented ...
- WinForm中的多语言处理
配置文件中存储当前语言环境,切换语言时进行修改,启动程序时读取该配置并设置当前线程的Culture 可根据线程的语言环境动态读取不同的资源文件,不同资源文件名用语言环境文本进行区分