题意:

  有n个飞机要降落,每机都可以在两个时间点上选择降落。但是两机的降落时间间隔太小会影响安全性,所以,要求两机的降落时间应该达到最大,当然也不能冲突了。问最大的时间间隔是多少?(其实问的是max(每种方案中两机间的最小间隔) )

思路:

  二分穷举每个时间间隔,对于每个间隔,建反向图,对图进行DFS着色看是否有冲突,无冲突的话证明此间隔是可以实现的。要找一个可以实现的,且间隔最大的。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <vector>
  5. #include <stack>
  6. #include <algorithm>
  7. #include <bits/stdc++.h>
  8. #define LL long long
  9. #define pii pair<int,int>
  10. #define INF 0x7f7f7f7f
  11. using namespace std;
  12. const int N=+;
  13. int n, s[N*], c=, col[N*], early[N], late[N];
  14. vector<int> vect[N*];
  15.  
  16. bool color(int x)
  17. {
  18. if(col[x^]) return false; //(x,x^1)这一对已经选好了x^1,你还想选x,肯定矛盾。
  19. if(col[x]) return true; //你要选的,刚好已选。
  20. col[x]=true;
  21. s[c++]=x;
  22. for(int i=; i<vect[x].size(); i++)
  23. {
  24. int t=vect[x][i];
  25. if(!color(t)) return false; //染色不成功
  26. }
  27. return true;
  28. }
  29.  
  30. int cal(int dis)
  31. {
  32. for(int i=; i<n*; i++) vect[i].clear();
  33. for(int i=; i<n; i++) //建图
  34. {
  35. for(int j=; j<n; j++)
  36. {
  37. if(i==j) continue;
  38. if( abs(early[i]-early[j])<dis ) vect[j*+ ].push_back(i* );
  39. if( abs(early[i]-late[j]) <dis ) vect[j* ].push_back(i* );
  40. if( abs(late[i] -early[j])<dis ) vect[j*+].push_back(i*+);
  41. if( abs(late[i] -late[j]) <dis ) vect[j*].push_back(i*+);
  42. }
  43. }
  44. memset(col,,sizeof(col)); //所有着色的都是要的
  45. memset(s,,sizeof(s)); //作为栈记录此次失败所标记过的,回头只需将栈中的点去掉标记
  46. for(int i=; i<n*; i+=)
  47. {
  48. if(!col[i] && !col[i+]) //都还未着色,如果有1个已经着色,那这对就已经选好了
  49. {
  50. c=;
  51. if( !color(i))
  52. {
  53. while(c) col[s[--c]]=; //选i是不行的,要清除刚才的着色。
  54. if(!color(i+)) return false; //i不行,就从i+1开始着色试试。
  55. }
  56. }
  57. }
  58. return true;
  59. }
  60.  
  61. int main()
  62. {
  63. freopen("input.txt", "r", stdin);
  64. int a, b, up;
  65. while(~scanf("%d",&n))
  66. {
  67. memset(early,,sizeof(early));
  68. memset(late,,sizeof(late));
  69. up=;
  70. for(int i=; i<n; i++)
  71. {
  72. scanf("%d%d",&early[i],&late[i]);
  73. up=max(late[i],up);
  74. }
  75.  
  76. int l=, r=up;
  77. while(l<=r)
  78. {
  79. int mid=(l+r)/;
  80. if(cal(mid)) l=mid+;
  81. else r=mid-;
  82. }
  83. printf("%d\n",l-);
  84. }
  85.  
  86. return ;
  87. }

AC代码

UVALive 3211 Now or later(2-SAT,二分,Kosaraju)的更多相关文章

  1. 【UVALive - 3211】Now or later (二分+2-SAT)

    题意: 有n架飞机需要着陆.每架飞机有两种选择,早着陆或者晚着陆,二选其一.现在为了保证飞机的着陆安全,要求两架着陆的飞机的时间间隔的最小值达到最大. 分析: 最小值最大问题我们想到二分答案.对于猜测 ...

  2. UVALive - 3211 (2-SAT + 二分)

    layout: post title: 训练指南 UVALive - 3211 (2-SAT + 二分) author: "luowentaoaa" catalog: true m ...

  3. UVALive - 3211 - Now or later(图论——2-SAT)

    Problem   UVALive - 3211 - Now or later Time Limit: 9000 mSec Problem Description Input Output Sampl ...

  4. 【二分答案+2-SAT】Now or later UVALive - 3211

    题目链接:https://cn.vjudge.net/contest/209473#problem/J 题目大意: 有n架飞机,每架飞机有两个可降落时间点a,b(a<b)(即一架飞机可以选择在时 ...

  5. UVALive - 3211 Now or later (二分+2SAT)

    题目链接 题意:有n架飞机,每架飞机有两个着陆时间点可以选,要求任意两架飞机的着陆时间之差不超过k,求k的最大值. 解法:由于每架飞机都有两个选择,并且必选且只能选其中一个,时间冲突也是发生在两架飞机 ...

  6. UVALive 3211 Now or later

    每架飞机有早晚起降两种方式,给定n架飞机两种方式的起落时间,为每架飞机安排起落时间(早或晚),使得所有飞机起降时间按照早到晚的顺序之间的间隔时间最小值尽量大. 分析: 最小时间尽量大应该采用二分的方法 ...

  7. 2-sat基础题 uvalive 3211

    蓝书325页的基础题 二分+2-sat //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using n ...

  8. LA 3211 飞机调度(2—SAT)

    https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间 ...

  9. UVALive 6609 Minimal Subarray Length(RMQ-ST+二分)

    题意:给定长度为N的数组,求一段连续的元素之和大于等于K,并且让这段元素的长度最小,输出最小长度即可,若不存在这样的元素集合,则输出-1 题目链接:UVAlive 6609 做法:做一个前缀和pref ...

随机推荐

  1. 【原创】一起学C++ 之指针的--/++ ---------C++ primer plus(第6版)

    讲*和++同时用于指针时提出了这样的问题:将什么解除引用,将什么递增. ]={21.1, 32.8, 23.4, 45.2, 37.4 }; double *pt=arr; //pt指针指向arr[0 ...

  2. 1076. Forwards on Weibo (30)

    时间限制 3000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Weibo is known as the Chinese v ...

  3. HDFS知识体系 思维导图

  4. go语言实现的目录共享程序

    其实程序很小,只不过是想写点东西了.后天晚上要回学校考试了,转眼已经出来了69天了,2个月多一点.工资加上老妈赞助的钱,不知道能不能买台电脑,作为程序员一直用着i3-3217u实在难受.回去找同学拷点 ...

  5. 带括号的四则混合运算的算符优先算法-----java实现

    1:主方法 package com.baidu; import java.text.NumberFormat;import java.util.ArrayList;import java.util.S ...

  6. CSS两列及三列自适应布局方法整理

    布局 自适应 两列 三列 在传统方法的基础上加入了Flex布局并阐述各方法的优缺点,希望对大家有所帮助.先上目录: 两列布局:左侧定宽,右侧自适应 方法一:利用float和负外边距 方法二:利用外边距 ...

  7. Win2003+iis6部署MVC4网站的方法

    1.服务器上安装SP2 和 IIS6 2.安装.Net Framework3.5 SP1(完整安装包,包含2.0 2.0SP1,237MB那个安装包) 3.安装.Net Framework4.0 4. ...

  8. PAT-乙级-1006. 换个格式输出整数 (15)

    1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...

  9. CSU1327+贪心+模拟

    题意简单,中文题目 方法:对于一个数 从左往右找相同的数 ,有就改变靠右的,同时把该数的右边全置0 注意!!!!n<0!!! /* */ #include<algorithm> #i ...

  10. c缺陷与陷阱笔记-第二章 语法陷阱

    1.函数的调用和番薯返回值是函数指针的声明 定义一个函数指针,例如  int (*fp)(float),这个函数的返回值是Int,参数是1个float类型,调用这个函数的方法是 (*fp)(),还有f ...