题意:有A,B,C三个任务要分给n个宇航员,年龄大于等于平均年龄的分A, 年龄小于平均年龄的分在B,C组没有界限,互为敌人的两个宇航员不可以在同一组.求出一个分配的方案。

思路:可以发现每个宇航员只有两种选择,选c或者不选c,用一个布尔变量xi代表第i个宇航员的选择,

对于相互为敌的两个年龄同时大于等于或同时小于平均年龄的宇航员,需要满足!(xi && xj)和!((!xi) && !(!xj))

对于年龄在平均年龄两侧的两个宇航员,只需要满足!(xi && xj),得到这些条件就可以建图然后用2-SAT算法求得答案。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
using namespace std;  const int maxn = 100000 + 1000;
//const int INF = 0x3f3f3f3f;//2-sat
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;}
} solver;
int n, m, age[maxn];
int main() {//freopen("input.txt", "r", stdin);while(scanf("%d%d", &n, &m)==2 && n) {solver.init(n);int su = 0, ave;for(int i = 0; i < n; i++) scanf("%d", &age[i]), su += age[i];ave = su%n==0 ? su/n : su/n+1;for(int i = 0; i < m; i++) {int u, v; scanf("%d%d", &u, &v);u--; v--;if(age[u]<ave&&age[v]<ave || age[u]>=ave&&age[v]>=ave) {solver.add_clause(u, 0, v, 0);solver.add_clause(u, 1, v, 1);}else {solver.add_clause(u, 0, v, 0);}}if(!solver.solve()) puts("No solution.");else {for(int i = 0; i < n; i++) {if(solver.mark[2*i]) {if(age[i] >= ave) puts("A");else puts("B");} else puts("C");}}} return 0;
}

UVALIVE 3713 Astronauts(2-SAT)相关推荐

  1. (2 sat) hdu 1824

    Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. 嵌入式系统开发:基于Linux学习笔记整理(学期汇总)

    Linux命令操作部分 Ubuntu虚拟机使用 快照 拍摄快照是为了方便还原虚拟机,因为虚拟机(Virtual Machine)是虚拟出来的出来的一台物理计算机,如果你在实验中操作不当或者其他原因导致 ...

  3. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  4. 第6-8课:分离轴算法(SAT)与碰撞检测(图文篇)

    物体的碰撞检测是游戏软件中的关键算法之一,两个角色是否能够对话.子弹是否击中了物体,以及是否出现人物穿墙的 bug,都依赖于一套可靠的碰撞检测算法.有很多算法可以实现碰撞检测,基于算法几何的方法有轴对 ...

  5. R语言用WinBUGS 软件对学术能力测验(SAT)建立层次(分层)贝叶斯模型

    R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开始).WinBUGS流程完成后,可以通过程序包本身将结果数据读 ...

  6. R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型

    原文链接:http://tecdat.cn/?p=11974 R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开 ...

  7. 布尔表达式可满足性问题(SAT)与库克-列文定理(上)

    下篇:布尔表达式可满足性问题(SAT)与库克-列文定理(下). 文章目录 一.布尔表达式可满足性问题(Boolean Satisfiability Problem, SAT) 二.形式语言与自动机 1 ...

  8. UVALive 7143 Room Assignment(组合数学+DP)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  9. UVALive 7139 Rotation(矩阵前缀和)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  10. UVALive 6619 LIKE vs CANDLE(树形DP)

    思路: 树形dp.因为最终答案要求的是差值,所以对于每个节点我们只需要考虑差值即可,dp[u][0]表示u节点以下(含u)中like的val比candle的val大的最大值,dp[u][1]表示can ...

最新文章

  1. C语言标准库之strcat函数
  2. 编写程序,输入某年某月,求该月有多少天
  3. oracle 表个数
  4. 浅谈JavaScript中的apply、call和bind
  5. Java - “JUC”原子类
  6. 2019 related conferences 相关会议 ISMAR, VRST, UIST
  7. 智慧金融管理系统提供个性化的智能客户服务
  8. 关于si4438以往犯的一些错误
  9. 获取注册表键值并格式转换
  10. WannaCry勒索病毒分析
  11. 认知神经科学技术革命
  12. 大数据-经典案例统计求和
  13. 前端按字母搜索相关内容
  14. 数据加密 RSA非对称加密篇
  15. 计算机对无人机的影响,无人机中的人工智能和自主性你了解多少
  16. 多进程中的进程锁(互斥锁)
  17. 知识付费项目不知如何获客?引流技巧你又知道多少?
  18. cad打印老显示rpc服务器不可用,win7打印机提示rpc服务器不可用怎么办-解决win7打印机提示rpc服务器不可用的方法 - 河东软件园...
  19. java-php-net-python-书籍租阅管理系统计算机毕业设计程序
  20. Windows桌面图标和分类美化小工具

热门文章

  1. CSS 引入的三种方式
  2. python excel表格去重_都说Excel大法好,Python大法其实也不错,批量去重处理更是神啊...
  3. ITEXT7 实现 PDF文档的合并与拆分
  4. mysql数据库安装过程蜿蜒曲折
  5. OpenAI公开Dota 2论文:胜率99.4%,「手术」工具连续迁移训练
  6. 苹果零售店被指销售翻新机
  7. vue typeScript get set 用法
  8. Oracle增加字段
  9. MyBatis-Plus 如何自动生成代码
  10. 联通光猫 - KD-YUN-811E - 管理员密码破解