LA 3211 Now or later
来源:互联网 发布:搜图软件 编辑:程序博客网 时间:2024/05/09 03:00
当出现要让最大值最小的时候,我们想到的思路首先是二分。我们二分当前的最大间距。对于每一次二分的距离,我们判断不同飞机两两之间的最早和最晚时间距离是不是小于当前二分的距离。如果是的话,说明这两者不能同时发生。换句话说,就是当a,b不能同时发生时,如果a发生,那么b一定不发生。如果b发生,那么a一定不发生,所以我们可以建两条边:a->非b,b->非a然后用2-sat判定当前的二分值是否能满足。
如下图,我们要建的是左边这样的边而不是右边的。注意a->非b不能推出 非b->a,逆命题不成立。
#include <iostream>#include<vector>#include<stdio.h>#include<cstring>#include<cmath>#define INF 100000010#define maxn 40010using namespace std;int n;int mark[maxn];int t[maxn][2];int mid;int c;int s[maxn];int ans;vector<int>G[maxn];void add_clause(int x,int va,int y,int vb){ x = x * 2 + va; y = y * 2 + vb; G[x].push_back(y^1); G[y].push_back(x^1);}void test(int mid){ 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++) { int temp = t[i][a] - t[j][b]; if(temp < 0) temp*=-1; if(temp < mid) //如果两个时间点的距离小于当前二分的距离,那么证明这两点是矛盾的 { //也就是说如果a,那么非b;如果b,那么非a add_clause(i,a,j,b); } }}bool dfs(int x){ if(mark[x ^ 1]) return false; //如果当前值的非已经标记为选定了,那么就说明这一点已经冲突 if(mark[x]) return true; mark[x] = 1; s[c++] = x; for(int i = 0; i < G[x].size(); i++) { if(!dfs(G[x][i])) return false; } return true;}bool work(){ for(int i = 0; i < 2 * n; i+=2) { if(!mark[i] && !mark[i+1]) { c = 0; if(!dfs(i)) { while(c > 0) mark[s[--c]] = 0; if(!dfs(i + 1)) return false; } } } return true;}int main(){ while(scanf("%d",&n)!=EOF) { for(int i = 0; i < n; i++) scanf("%d %d",&t[i][0],&t[i][1]); //最早时间和最晚时间 int low = 0; int high = INF; while(low <= high) { int mid = (low + high)>>1; for(int i = 0; i < 2 * n; i++) G[i].clear(); memset(mark,0,sizeof mark); test(mid); //对当前距离建边 if(work()) {low = mid + 1;ans = mid;} else {high = mid - 1;} } printf("%d\n",ans); } return 0;}
0 0
- LA 3211 Now or later
- LA 3211 Now or Later
- LA 3211 Now or later
- LA 3211 Now or later / 2-SAT
- LA 3211(p325)----Now or later
- LA 3211 Now or later (2 - SAT) - from lanshui_Yang
- LA 3211 Now or later
- LA 3211 Now or Later(2-SAT问题)
- LA 3211 Now or later (2-SAT + 二分)
- 飞机调度(Now or later,LA 3211)
- LA 3211 Now or later(2-SAT)
- UVALive 3211 Now or later
- UVALive - 3211 Now or later (2-SAT)
- UVALive 3211 Now or later 二分+Twosat
- uva1146 - Now or later
- UVA1146 Now or later
- UVA1146 Now or later
- now or later
- 插入排序
- Solve this equation&& Just Solve It(二分)
- mybatis实战教程(mybatis in action)之二:以接口的方式编程
- 如何用javac 和java 编译运行整个Java工程
- Cotex 滴答定时器详解
- LA 3211 Now or later
- cocos2d-x学习笔记(二)Eclipse+cdt实现cocos2dx跨平台解决方案(转)
- 面试有戏的六个信号
- Q10.2~Q10.
- jQuery Media Plugin 插件实现在线视频播放业务
- assert()函数的使用
- LR---Loadrunner11破解方法
- 自定义formbean验证框架
- Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程