POJ 3683 Priest John's Busiest Day (2-SAT)
题意:有n对新人要在同一天结婚。结婚时间为Ti到Di,这里有时长为Si的一个仪式需要神父出席。神父可以在Ti-(Ti+Si)这段时间出席也可以在(Di-Si)-Si这段时间。问神父能否出席所有仪式,如果可以输出一组时间安排。
思路:2-SAT。神父可以在开始出席也可以在结束时候出席,要求与其他出席时间没有冲突,这样建图计算即可。另一一定要弄清楚true和false代表的含义。
- #include <cstdio>
- #include <cmath>
- #include <vector>
- #include <cstring>
- #include <string>
- #include <iostream>
- using namespace std;
- ;
- struct TwoSAT
- {
- int n;
- vector<];
- ];
- ],c;
- bool dfs(int x)
- {
- ]) return false;
- if(mark[x]) return true;
- mark[x]=true;
- S[c++]=x;
- ; i<G[x].size(); ++i)
- if(!dfs(G[x][i])) return false;
- return true;
- }
- void init(int n)
- {
- this->n=n;
- ; i<n*; ++i) G[i].clear();
- memset(mark,,sizeof(mark));
- }
- void add_clause(int x,int xval,int y,int yval)
- {
- x=x*+xval;
- y=y*+yval;
- G[x^].push_back(y);
- G[y^].push_back(x);
- }
- bool solve()
- {
- ; i<n*; i+=)
- {
- ])
- {
- c=;
- if(!dfs(i))
- {
- ) mark[S[--c]]=false;
- )) return false;
- }
- }
- }
- return true;
- }
- };
- TwoSAT solver;
- bool judge(int st1,int ed1,int st2,int ed2)
- {
- if(st1<=st2&&ed2<=ed1) return true;
- if(st2<=st1&&ed1<=ed2) return true;
- if(st1<st2&&st2<ed1&&ed2>ed1) return true;
- if(st2<st1&&st1<ed2&&ed1>ed2) return true;
- return false;
- }
- int TimetoInt(string str)
- {
- ]-+(str[]-+(str[]-+(str[]-');
- return t;
- }
- string InttoTime(int t)
- {
- string str;
- ,b=t%;
- str+=(a/+');
- str+=(a%+');
- str+=':';
- str+=(b/+');
- str+=(b%+');
- return str;
- }
- ],t[][];
- int n;
- bool solve()
- {
- solver.init(n);
- ; i<n; ++i); a<; ++a)
- ; j<n; ++j) ; b<; ++b)
- {
- int ast,aed;
- int bst,bed;
- ) ast=t[i][a],aed=t[i][a]+cost[i];
- else ast=t[i][a]-cost[i],aed=t[i][a];
- )bst=t[j][b],bed=t[j][b]+cost[j];
- else bst=t[j][b]-cost[j],bed=t[j][b];
- if(judge(ast,aed,bst,bed))
- solver.add_clause(i,a^,j,b^);
- }
- return solver.solve();
- }
- int main()
- {
- while(cin>>n)
- {
- ; i<n; ++i)
- {
- string st,ed;
- cin>>st>>ed>>cost[i];
- t[i][]=TimetoInt(st);
- t[i][]=TimetoInt(ed);
- }
- if(!solve()) cout<<"NO"<<endl;
- else
- {
- cout<<"YES"<<endl;
- ; i<*n; i+=)
- {
- if(!solver.mark[i])
- cout<<InttoTime(t[i/][])<<][]+cost[i/])<<endl;
- else
- cout<<InttoTime(t[i/][]-cost[i/])<<][])<<endl;
- }
- }
- }
- ;
- }
POJ 3683 Priest John's Busiest Day (2-SAT)的更多相关文章
- POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题)
POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题) Descripti ...
- POJ 3683 Priest John's Busiest Day(2-SAT+方案输出)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10010 Accep ...
- POJ 3683 Priest John's Busiest Day (2-SAT)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6900 Accept ...
- POJ 3683 Priest John's Busiest Day(2-SAT 并输出解)
Description John is the only priest in his town. September 1st is the John's busiest day in a year b ...
- poj - 3683 - Priest John's Busiest Day(2-SAT)
题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...
- POJ 3683 Priest John's Busiest Day (2-SAT,常规)
题意: 一些人要在同一天进行婚礼,但是牧师只有1个,每一对夫妻都有一个时间范围[s , e]可供牧师选择,且起码要m分钟才主持完毕,但是要么就在 s 就开始,要么就主持到刚好 e 结束.因为人数太多了 ...
- POJ 3683 Priest John's Busiest Day
2-SAT简单题,判断一下两个开区间是否相交 #include<cstdio> #include<cstring> #include<cmath> #include ...
- POJ 3683 Priest John's Busiest Day[2-SAT 构造解]
题意: $n$对$couple$举行仪式,有两个时间段可以选择,问是否可以不冲突举行完,并求方案 两个时间段选择对应一真一假,对于有时间段冲突冲突的两人按照$2-SAT$的规则连边(把不冲突的时间段连 ...
- POJ 3683 Priest John's Busiest Day 【2-Sat】
这是一道裸的2-Sat,只要考虑矛盾条件的判断就好了. 矛盾判断: 对于婚礼现场 x 和 y,x 的第一段可以和 y 的第一段或者第二段矛盾,同理,x 的第二段可以和 y 的第一段或者第二段矛盾,条件 ...
随机推荐
- Cognos10安装注意事项
cognos10用db2做content management注意事项 1. 建议用UTF-8格式字符2. 建议pagesize用8K或者8K以上3. 新建数据库缓冲池pagesize和以上1.2设置 ...
- 20169212《Linux内核原理及分析》第十二周作业
格式化字符串漏洞实验 格式化字符串漏洞是由像 printf(user_input) 这样的代码引起的,其中 user_input 是用户输入的数据,具有 Set-UID root 权限的这类程序在运行 ...
- 我的毕业设计——基于安卓和.NET的笔记本电脑远程控制系统
手机端: 电脑端: 答辩完成后会开放代码.
- Android在代码中使用布局文件中的一个组件
使用前必须要把组件与其父组件的关系断开,比如有一个组件的名称为scrollChildLayout,则可以使用下面的代码进行分离 ((ViewGroup)scrollChildLayout.getPar ...
- 自己不懂的SQL语句用法
left join:是SQL语言中的查询类型,即连接查询.它的全称为左外连接,是外连接的一种. 连接通常可以在select语句的from子句或where子句中建立,其语法格式为: select c ...
- ie浏览器兼容问题汇总
对兼容ie浏览器所遇到的问题及总结 互联快谈 2016-10-28 05:51 1,若直接给一个元素设置absolute定位.在浏览器缩放的时候.位置会错位.解决的方法是给外层的元素设置为relati ...
- CSS入门
CSS,层叠样式表,是对web页面显示效果进行控制的一套标准.当页面的内容受多种样式控制,将会按照一定的顺序处理.CSS的作用:(1)将网页的内容结构和格式控制分开.(2)可以精确控制页面的所有元素. ...
- 用java实现简易PC版2048
import java.awt.Color; import java.awt.EventQueue; import java.awt.BorderLayout; import java.awt.Flo ...
- HDU 4941 Magical Forest(2014 Multi-University Training Contest 7)
思路:将行列离散化,那么就可以用vector 存下10W个点 ,对于交换操作 只需要将行列独立分开标记就行 . r[i] 表示第 i 行存的是 原先的哪行 c[j] 表示 第 j ...
- Fibonacci(斐波那契)递归实现。容易看懂
#include<iostream>using namespace std;int fibonacci(int n){if(n<=0) return 0; else if(n==1) ...