题目链接

题意:有n架飞机。每架飞机都能够选择早着陆和晚着陆两种方式之中的一个,且必须选择一种。

任务就是安排全部飞机着陆时。相邻两个着陆时间间隔的最小值尽量大。

思路:用二分处理最小值尽量大。该题目能够转化为是否存在一个调度方案,使得相邻两个着陆时间差总是不小于P,进一步转化为随意两个着陆时间差总是不小于P。

,如果布尔变量xi表示第i架飞机是否早着陆。唯一限制就是“时间差小于P的两个着陆时间不能同一时候满足。每一组不能同一时候满足的着陆时间相应一个子句,则整个约束条件相应于2-SAT问题的实例。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int MAXN = 2005; struct TwoSAT{
int n;
vector<int> g[MAXN * 2];
bool mark[MAXN * 2];
int s[MAXN * 2], c; bool dfs(int x) {
if (mark[x^1]) return false;
if (mark[x]) return true;
mark[x] = true;
s[c++] = x;
for (int i = 0; i < g[x].size(); i++)
if (!dfs(g[x][i])) return false;
return true;
} void init(int n) {
this->n = n;
for (int i = 0; i < n * 2; i++)
g[i].clear();
memset(mark, 0, sizeof(mark));
} void add_clause(int x, int xval, int y, int yval) {
x = x * 2 + xval;
y = y * 2 + yval;
g[x^1].push_back(y);
g[y^1].push_back(x);
} bool solve() {
for (int i = 0; i < n * 2; i += 2)
if (!mark[i] && !mark[i + 1]) {
c = 0;
if (!dfs(i)) {
while (c > 0) mark[s[--c]] = false;
if (!dfs(i + 1)) return false;
}
}
return true;
}
}; TwoSAT solver;
int n, T[MAXN][2]; bool test(int diff) {
solver.init(n);
for (int i = 0; i < n; i++)
for (int a = 0; a < 2; a++)
for (int j = i + 1; j < n; j++)
for (int b = 0; b < 2; b++)
if (abs(T[i][a] - T[j][b]) < diff)
solver.add_clause(i, a^1, j, b^1);
return solver.solve();
} int main() {
while (scanf("%d", &n) != EOF) {
memset(T, 0, sizeof(T));
int L = 0, R = 0;
for (int i = 0; i < n; i++)
for (int a = 0; a < 2; a++) {
scanf("%d", &T[i][a]);
R = max(R, T[i][a]);
}
while (L < R) {
int mid = L + (R - L + 1) / 2;
if (test(mid))
L = mid;
else
R = mid - 1;
}
printf("%d\n", L);
}
return 0;
}

最新文章

  1. [转]runtime 消息机制
  2. Spark BlockManager的通信及内存占用分析(源码阅读九)
  3. oracle创建表之前判断表是否存在,如果存在则删除已有表
  4. Spring整合Hibernate之AnnotationSessionFactoryBean与LocalSessionFactoryBean
  5. [Prodinner项目]学习分享_第二部分_Entity到DB表的映射
  6. Vue.js相关知识2-组件
  7. Lucene基于IKAnalyzer配置的词典扩充
  8. hdu 1171 Big Event in HDU(多重背包+二进制优化)
  9. JSF 2.0 hello world example
  10. The First
  11. 关于css中overflow的一些理解
  12. FZU 2086 餐厅点餐(模拟)
  13. Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)
  14. 总结css常用方法
  15. 【原创】大数据基础之Kerberos(2)hive impala hdfs访问
  16. 20.2.翻译系列:EF 6中基于代码的数据库迁移技术【EF 6 Code-First系列】
  17. Centos 6.8安装ideaIU-2017.2.6-no-jdk
  18. java 数组(二)
  19. C++基于范围的for循环性能测试(针对std::vector)
  20. 初学FPGA

热门文章

  1. vue $parent 的上一级 有可能不是父组件,需要好几层$parent 如果这样 还不如用 this.$emit
  2. python制作二维码
  3. 在Foxmail邮件客户端登录263企业邮箱
  4. 用户管理命令--passwd,usermod,userdel
  5. l5-repository基本使用--结合使用artisan
  6. CentOS 7的docker安装初始化
  7. Linux组和提权
  8. soc desgin 目前需要做的事情
  9. matlab自定义函数的五种表示(前2种重点)
  10. windows操作笔记