51Nod 1331 狭窄的通道
有一个长为L的狭窄通道,我们假设这个通道在x轴上,其两个出口分别在x=0与x=L处。在这个通道里有N只狼,第i只狼有一个初始位置ai,它想到达位置bi(0<=i<N)。但是这个通道太狭窄了不能允许两只狼相互交换位置他们的位置,因此如果两只狼需要交换它们的位置他们需要同时离开这个通道到x=0或x=L处在那里重新安排进通道的顺序。在x<=0与x>=L处空间足够大可以装下任意数量的狼。那么所有的狼想从ai到bi它们总共最少走多远的距离,输出这个距离。
注意:在x<=0和x>=L的通道外部空间中移动的距离不计算在内;另外,x=0到x=L只能通过通道连通,即通道外面的世界不能从x=0走到x=L处。
解题报告:
用时:2h,2WA
这题一开始想到按照起点排序,然后枚举一个断点,断点左边先全走到0(称之为左集合),右边((称为右集合)先全都走到L,然后问题来了,拍的时候发现有时候到终点的顺序还需要调整,也就是说还有一些狼需要从0走到L,也还有一些要从L走到0,本蒟蒻就不知道怎么处理了.
参考题解:
将左右两边分别都按终点从小到大排序,然后处理终点的矛盾,具体的我不清楚,我就乱写了个\(O(n^2)\)的矛盾处理,在枚举了起点的断点的基础上,我再从右集合中枚举了终点的一个断点,设他的终点为t,把终点小于t的属于左集合的全部都移动到L中,并且把右边集合的中小于t的移动到0,这样矛盾就解决了
然后发现还是不行,发现样例中还有直接从s移动到t的,于是我们选择判掉这一段,显然直接从s到t的必须是连续的一段区间,且左边的那矛盾的一段必须移动到0,右边的矛盾的一段必须移动到L,所以考虑枚举左边一段的终点和右边一段的起点,然后加上中间一段直接移动的即可
复杂度:\(O(n^3)\)
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=55,inf=2e8;
int n,L;
struct node{
int s,t;
}a[N];
bool comps(const node &p,const node &q){
return p.s<q.s;
}
bool compt(const node &p,const node &q){
return p.t<q.t;
}
int ans=2e8;
void solve(int x){
int tot=0;
sort(a+1,a+x+1,compt);
sort(a+x+1,a+n+1,compt);
for(int i=1;i<=x;i++)
tot+=a[i].s+a[i].t;
for(int i=x+1;i<=n;i++)
tot+=L-a[i].s+L-a[i].t;
int tmp=0,tl=0;
for(int i=x+1;i<=n;i++){
tmp=0;
for(int j=1;j<=x;j++){
if(a[j].t>=a[i].t)tmp+=L-a[j].t+L-a[j].t;
}
ans=Min(ans,tot+tmp+tl);
tl+=a[i].t+a[i].t;
}
}
bool check(int l,int r,int sl,int sr){
int lm=0,rm=2e8;
for(int i=l;i<=r;i++)lm=Max(lm,a[i].t);
for(int i=sl;i<=sr;i++)rm=Min(rm,a[i].t);
return lm<rm;
}
void work()
{
ans=2e8;
scanf("%d%d",&n,&L);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].s,&a[i].t);
}
for(int i=0;i<=n;i++){
sort(a+1,a+n+1,comps);
solve(i);
}
sort(a+1,a+n+1,comps);
int si=0;
for(int i=0;i<=n;i++){
si+=a[i].t+a[i].s;
if(!check(1,i,i+1,n))continue;
int j=i+1,tot=0;
for(;j<=n;j++)
if(!check(i+1,j,j+1,n))break;
for(int k=i+1;k<j;k++)tot+=abs(a[k].t-a[k].s);
for(int k=j;k<=n;k++)tot+=L-a[k].s+L-a[k].t;
ans=Min(ans,si+tot);
}
printf("%d\n",ans);
}
int main()
{
int T;cin>>T;
while(T--)work();
return 0;
}
51Nod 1331 狭窄的通道的更多相关文章
- 【51nod 1331】狭窄的通道
Description 有一个长为L的狭窄通道,我们假设这个通道在x轴上,其两个出口分别在x=0与x=L处.在这个通道里有N只狼,第i只狼有一个初始位置ai,它想到达位置bi(0<=i<N ...
- 51nod1331 狭窄的通道
题目传送门 这道题 51nod只Ac了十二个人 没有题解可以研究 所以就自己YY了半天 在这里先感谢一波岚清大爷 orz 然后这道题我分了两种情况 一种是左边的往左跑右边的往右跑 中间有一部分直接走不 ...
- 金山中学 rugular SRM 04 ——纪念我的第一次Ak
虽然只是一场比较简单的比赛 但奈何我也比较弱啊.... T1 一道计算概率的题目 T SRM 04 描述 给个长度为 n 的数列,每次操作能将数列打乱(RandomShuffle),问在期望下需要多少 ...
- 游戏AI技术 2
[Unity3D人工智能编程精粹 2] 1.跟随领队行为. 用靠近(Seek)或追逐(Pursuit)实现跟随领队行为并不好.在Seek中,AI角色会被推向领队,最终与领队占据相同位置.而Pursui ...
- 基于SketchUp和Unity3D的虚拟场景漫游和场景互动
这是上学期的一次课程作业,难度不高但是也一并记录下来,偷懒地拿课程报告改改发上来. 课程要求:使用sketchUp建模,在Unity3D中实现场景漫游和场景互动. 知识点:建模.官方第一人称控制器.网 ...
- 默 of 2018:年终总结
目录 1 概述:在平凡中求变 2 专业分流:一个时代的终点,我的新起点 2.1 我在专业分流前夕的境况 2.2 专业分流情况概述,以及对一篇文章的回顾 2.3 总结与余绪 2.4 附:关于理科与工科的 ...
- High-level NavMesh Building Components
Here we introduce four high level components for the navigation system: //这里我们介绍四个高水平导航系统组件: NavMesh ...
- 51Nod 1667 概率好题 - 容斥原理
题目传送门 无障碍通道 有障碍通道 题目大意 若$L_{i}\leqslant x_{i} \leqslant R_{i}$,求$\sum x_{i} = 0$以及$\sum x_{i} < 0 ...
- 用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线
我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...
随机推荐
- 《Language Implementation Patterns》之 增强解析模式
上一章节讲述了基本的语言解析模式,LL(k)足以应付大多数的任务,但是对一些复杂的语言仍然显得不足,已付出更多的复杂度.和运行时效率为代价,我们可以得到能力更强的Parser. Pattern 5 : ...
- io多路复用(一)
sever端 1 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001,)) sk1.listen() sk2 = socket ...
- 多种在线地图综合对比,Google,必应,arcgis Online...
不同网络地图的对比 天地图 坐标系:WGS84 地图配色: POI数量:丰富 有无建筑:有 地图特点:天地图按照国家标准进行配图,道路.水系.植被等图层用对应颜色渲染, POI信息丰富, ...
- 微信支付get_brand_wcpay_request:fail
最近做了微信支付功能,和后端一起踩坑中,微信一直报错:get_brand_wcpay_request:fail 出现该问题的原因: 1.生成的sign签名有问题 2.支付授权目录配置有问题 在经过仔细 ...
- Python习题(第一课)
想了想其他的太简单了,还是不放了,剩三题吧. 一.完美立方 编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a^3= b^3 + c^3 + d^3,其中 ...
- JAVA_SE基础——48.多态
面向对象程序设计的三个特点是封装.继承和多态.前面已经学习了前两个特点.本章节将介绍多态性. 多态:一个对象具备多种形态.(父类的引用类型变量指向了子类的对象)或者是接口 的引用类型变量指向了接口实现 ...
- thinkphp后台向前台传值没有传过去的小问题
if($listyyarr){ $this->assign('listyyarr',$listyyarr); //$this->assign('nowDated',$endDated); ...
- JWT(JSON Web Token) 多网站的单点登录,放弃session
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...
- 新概念英语(1-43)Hurry up!
新概念英语(1-43)Hurry up! How do you know Sam doesn't make the tea very often? A:Can you make the tea, Sa ...
- LayUI之table数据表格获取行、行高亮等相关操作
前言 目前LayUI数据表格既美观有不乏一些实用功能.基本上表格应有的操作已经具备,LayUI作者[贤心]肯定是煞费苦心去优化,此处致敬.但是实话实话,如果单纯那数据表格功能来说,EasUI的数据表格 ...