有一个长为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)\)

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <cmath>
  7. #define RG register
  8. #define il inline
  9. #define iter iterator
  10. #define Max(a,b) ((a)>(b)?(a):(b))
  11. #define Min(a,b) ((a)<(b)?(a):(b))
  12. using namespace std;
  13. const int N=55,inf=2e8;
  14. int n,L;
  15. struct node{
  16. int s,t;
  17. }a[N];
  18. bool comps(const node &p,const node &q){
  19. return p.s<q.s;
  20. }
  21. bool compt(const node &p,const node &q){
  22. return p.t<q.t;
  23. }
  24. int ans=2e8;
  25. void solve(int x){
  26. int tot=0;
  27. sort(a+1,a+x+1,compt);
  28. sort(a+x+1,a+n+1,compt);
  29. for(int i=1;i<=x;i++)
  30. tot+=a[i].s+a[i].t;
  31. for(int i=x+1;i<=n;i++)
  32. tot+=L-a[i].s+L-a[i].t;
  33. int tmp=0,tl=0;
  34. for(int i=x+1;i<=n;i++){
  35. tmp=0;
  36. for(int j=1;j<=x;j++){
  37. if(a[j].t>=a[i].t)tmp+=L-a[j].t+L-a[j].t;
  38. }
  39. ans=Min(ans,tot+tmp+tl);
  40. tl+=a[i].t+a[i].t;
  41. }
  42. }
  43. bool check(int l,int r,int sl,int sr){
  44. int lm=0,rm=2e8;
  45. for(int i=l;i<=r;i++)lm=Max(lm,a[i].t);
  46. for(int i=sl;i<=sr;i++)rm=Min(rm,a[i].t);
  47. return lm<rm;
  48. }
  49. void work()
  50. {
  51. ans=2e8;
  52. scanf("%d%d",&n,&L);
  53. for(int i=1;i<=n;i++){
  54. scanf("%d%d",&a[i].s,&a[i].t);
  55. }
  56. for(int i=0;i<=n;i++){
  57. sort(a+1,a+n+1,comps);
  58. solve(i);
  59. }
  60. sort(a+1,a+n+1,comps);
  61. int si=0;
  62. for(int i=0;i<=n;i++){
  63. si+=a[i].t+a[i].s;
  64. if(!check(1,i,i+1,n))continue;
  65. int j=i+1,tot=0;
  66. for(;j<=n;j++)
  67. if(!check(i+1,j,j+1,n))break;
  68. for(int k=i+1;k<j;k++)tot+=abs(a[k].t-a[k].s);
  69. for(int k=j;k<=n;k++)tot+=L-a[k].s+L-a[k].t;
  70. ans=Min(ans,si+tot);
  71. }
  72. printf("%d\n",ans);
  73. }
  74. int main()
  75. {
  76. int T;cin>>T;
  77. while(T--)work();
  78. return 0;
  79. }

51Nod 1331 狭窄的通道的更多相关文章

  1. 【51nod 1331】狭窄的通道

    Description 有一个长为L的狭窄通道,我们假设这个通道在x轴上,其两个出口分别在x=0与x=L处.在这个通道里有N只狼,第i只狼有一个初始位置ai,它想到达位置bi(0<=i<N ...

  2. 51nod1331 狭窄的通道

    题目传送门 这道题 51nod只Ac了十二个人 没有题解可以研究 所以就自己YY了半天 在这里先感谢一波岚清大爷 orz 然后这道题我分了两种情况 一种是左边的往左跑右边的往右跑 中间有一部分直接走不 ...

  3. 金山中学 rugular SRM 04 ——纪念我的第一次Ak

    虽然只是一场比较简单的比赛 但奈何我也比较弱啊.... T1 一道计算概率的题目 T SRM 04 描述 给个长度为 n 的数列,每次操作能将数列打乱(RandomShuffle),问在期望下需要多少 ...

  4. 游戏AI技术 2

    [Unity3D人工智能编程精粹 2] 1.跟随领队行为. 用靠近(Seek)或追逐(Pursuit)实现跟随领队行为并不好.在Seek中,AI角色会被推向领队,最终与领队占据相同位置.而Pursui ...

  5. 基于SketchUp和Unity3D的虚拟场景漫游和场景互动

    这是上学期的一次课程作业,难度不高但是也一并记录下来,偷懒地拿课程报告改改发上来. 课程要求:使用sketchUp建模,在Unity3D中实现场景漫游和场景互动. 知识点:建模.官方第一人称控制器.网 ...

  6. 默 of 2018:年终总结

    目录 1 概述:在平凡中求变 2 专业分流:一个时代的终点,我的新起点 2.1 我在专业分流前夕的境况 2.2 专业分流情况概述,以及对一篇文章的回顾 2.3 总结与余绪 2.4 附:关于理科与工科的 ...

  7. High-level NavMesh Building Components

    Here we introduce four high level components for the navigation system: //这里我们介绍四个高水平导航系统组件: NavMesh ...

  8. 51Nod 1667 概率好题 - 容斥原理

    题目传送门 无障碍通道 有障碍通道 题目大意 若$L_{i}\leqslant x_{i} \leqslant R_{i}$,求$\sum x_{i} = 0$以及$\sum x_{i} < 0 ...

  9. 用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线

    我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...

随机推荐

  1. vue2 前端搜索实现

    项目数据少的时候,搜索这样的小事情就要交给咱们前端来做了,重要声明,适用于小项目!!!!! 其实原理很简单,小demo是做搜索市区名称或者按照排名搜索. <div> <input t ...

  2. Struts2之配置文件中Action的详细配置(续)

    承接上一篇 4.处理结果的配置 Action类的实例对象调用某个方法,处理完用户请求之后,将返回一个逻辑视图名的字符串.核心Filter收到返回的逻辑视图名字符串,根据struts.xml中的逻辑视图 ...

  3. 完美解决ubuntu Desktop 16.04 中文版firefox在非root用户不能正常启动的问题

    ubuntu安装好后,默认安装有firefox浏览器,不过,非root的账户登录,双击firefox图标,居然出现如下提示:Your Firefox profile cannot be loaded. ...

  4. javascript中的数组对象

    1.创建数组的三种方式: 1.1 var 数组名=[元素1,元素2,元素3...]; 例如: var arr1=[1,2,3,4]; 1.2 var 数组名=new Array(元素1,元素2,元素3 ...

  5. 新概念英语(1-139)Is that you, John?

    Lesson 139 Is that you, John? 是你吗,约翰? Listen to the tape then answer this question. Which John Smith ...

  6. SpringCloud的服务消费者 (一):(rest+ribbon)访问注册的微服务

    采用Ribbon或Feign方式访问注册到EurekaServer中的微服务.1.Ribbon实现了客户端负载均衡,Feign底层调用Ribbon2.注册在EurekaServer中的微服务api,不 ...

  7. JS解析JSON字符串

    问题描述:后台需要传递给前台一些数据,用于页面数据显示,因为是一些Lable标签,所以数据传递到前台需要解析. 思路:因为数据比较杂乱,所以我选择传递的数据类型是Json格式,但是数据展示时需要解析成 ...

  8. Python学习之参数

    参数 # coding=utf-8 # 函数的参数 def power(x): return x * x; print power(5) 修改后 def power_1(x,n=2): #默认参数可以 ...

  9. 爬虫必备 User-Agent 列表

    USER_AGENTS = [ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR ...

  10. Centos系统运行nodejs

    这里我们需要先搭建一下运行的环境,直接yum安装就可以了! [root@iZwz9f80ph5u8tlqp6pi9cZ ~]# yum -y install nodejs 这里我们的环境就搭好了!安装 ...