【UVALive - 3211】Now or later (二分+2-SAT)
题意:
有n架飞机需要着陆。每架飞机有两种选择,早着陆或者晚着陆,二选其一。现在为了保证飞机的着陆安全,要求两架着陆的飞机的时间间隔的最小值达到最大。
分析:
最小值最大问题我们想到二分答案。对于猜测值x,判断是否有一种方案使相邻两着陆时间都不小于x。
如果两架飞机的某着陆时间差小于p,证明不能同时选择。根据这个条件建图,再用2-SAT判断是否有解即可。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define Maxn 2010
#define Maxm 10000010 int n;
int first[*Maxn],mark[*Maxn],s[*Maxn];
int a[Maxn],b[Maxn];
int c,v; struct node
{
int x,y,next;
}t[*Maxm];int len; int mymax(int x,int y) {return x>y?x:y;}
int myabs(int x) {return x<?-x:x;} void ins(int x,int y)
{
t[++len].x=x;t[len].y=y;
t[len].next=first[x];first[x]=len;
} bool dfs(int x)
{
if(mark[x^]) return ;
if(mark[x]) return ;
mark[x]=;
s[++c]=x;
for(int i=first[x];i;i=t[i].next)
if(!dfs(t[i].y)) return ;
return ;
} bool solve()
{
memset(mark,,sizeof(mark));
for(int i=;i<n;i++)
if(!mark[*i]&&!mark[*i+])
{
c=;
if(!dfs(*i))
{
while(c>) mark[s[c--]]=;
if(!dfs(*i+)) return ;
}
}
return ;
} bool check(int x)
{
memset(first,,sizeof(first));len=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
{
if(myabs(a[i]-a[j])<x) {ins((i-)*,(j-)*+); ins((j-)*,(i-)*+);}
if(myabs(a[i]-b[j])<x) {ins((i-)*,(j-)*); ins((j-)*+,(i-)*+);}
if(myabs(b[i]-a[j])<x) {ins((i-)*+,(j-)*+); ins((j-)*,(i-)*);}
if(myabs(b[i]-b[j])<x) {ins((i-)*+,(j-)*); ins((j-)*+,(i-)*);}
}
return solve();
} void ffind(int l,int r)
{
int mid;
while(l<r)
{
mid=(l+r+)>>;
if(check(mid)) l=mid;
else r=mid-;
}
printf("%d\n",l);
} int main()
{
while(scanf("%d",&n)!=EOF)
{
int mx=;
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
mx=mymax(mx,mymax(a[i],b[i]));
}
ffind(,mx);
}
return ;
}
[LA3211]
2016-03-25 13:46:05
【UVALive - 3211】Now or later (二分+2-SAT)的更多相关文章
- UVALive - 3211 Now or later (二分+2SAT)
题目链接 题意:有n架飞机,每架飞机有两个着陆时间点可以选,要求任意两架飞机的着陆时间之差不超过k,求k的最大值. 解法:由于每架飞机都有两个选择,并且必选且只能选其中一个,时间冲突也是发生在两架飞机 ...
- UVALive - 3211 (2-SAT + 二分)
layout: post title: 训练指南 UVALive - 3211 (2-SAT + 二分) author: "luowentaoaa" catalog: true m ...
- UVa 3211 Now or later (二分+2-Sat)
题意:有 n 架飞机,每个飞机早着陆,或者晚着陆,让你安排一个方式,让他们着陆的时间间隔尽量大. 析:首先对于时间间隔,可以用二分来解决,然后就成了一个判定性问题,然后怎么判断该时间间隔是不是成立呢, ...
- UVALive - 3211 - Now or later(图论——2-SAT)
Problem UVALive - 3211 - Now or later Time Limit: 9000 mSec Problem Description Input Output Sampl ...
- UVALive 3211 Now or later(2-SAT,二分,Kosaraju)
题意: 有n个飞机要降落,每机都可以在两个时间点上选择降落.但是两机的降落时间间隔太小会影响安全性,所以,要求两机的降落时间应该达到最大,当然也不能冲突了.问最大的时间间隔是多少?(其实问的是max( ...
- 【二分答案+2-SAT】Now or later UVALive - 3211
题目链接:https://cn.vjudge.net/contest/209473#problem/J 题目大意: 有n架飞机,每架飞机有两个可降落时间点a,b(a<b)(即一架飞机可以选择在时 ...
- UVALive 3211 Now or later
每架飞机有早晚起降两种方式,给定n架飞机两种方式的起落时间,为每架飞机安排起落时间(早或晚),使得所有飞机起降时间按照早到晚的顺序之间的间隔时间最小值尽量大. 分析: 最小时间尽量大应该采用二分的方法 ...
- Gym 101194D / UVALive 7900 - Ice Cream Tower - [二分+贪心][2016 EC-Final Problem D]
题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...
- 2-sat基础题 uvalive 3211
蓝书325页的基础题 二分+2-sat //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using n ...
随机推荐
- careercup-栈与队列 3.5
3.5 实现一个MyQueue类,该类用两个栈来实现一个队列. 解答 队列是先进先出的数据结构(FIFO),栈是先进后出的数据结构(FILO), 用两个栈来实现队列的最简单方式是:进入队列则往第一个栈 ...
- 网络学习笔记----01--pathping跟踪数据包路径
操作系统win7 Pathping主要用于提供有关在来源和目标之间的中间跃点处的网络滞后和网络丢失的信息. Pathping将多个回显请求消息发送到来源和目标之间的各个路由器一段时间,然后根据各个路由 ...
- 如何打包成jar包自己看呢?
第一步:选择你要导出的部分 第二步:
- 什么是JavaScript?
- Js 上传文件 页面不刷新
html控件代码: <form id="form1"> <p><input type="file" name="mfil ...
- .NET3.5中的高性能 Socket API
转载:http://www.cnblogs.com/TianFang/archive/2007/11/09/954730.html 在 .NET Framework 2.0 版本中,System.Ne ...
- Fragment的生命周期和Activity之间的通信以及使用
Fragment通俗来讲就是碎片,不能单独存在,意思就是说必须依附于Activity,一般来说有两种方式把Fragment加到Activity,分为静态,动态. 静态即为右键单击,建立一个Fragme ...
- SQL Server中Id自增列的最大Id是多少
什么是自增列 在SQL Server中可以将Id列设为自增.即无需为Id指定值,由SQL Server自动给该列赋值,每新增一列Id的值加一,初始值为1. 需要注意的是即使将原先添加的所有数据都删除, ...
- help python(查看模块帮助文档)
查看模块帮助文档: help(len) -- docs for the built in len function (note here you type "len" not &q ...
- 检查.gitignore语法
每次配置git的时候,要写gitignore文件,你知道你的.gitignore匹配那些文件吗? 看看.gitignore放过了哪些文件: git ls-files -ocm --exclude-st ...