博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LA 3713 宇航员分组
阅读量:4883 次
发布时间:2019-06-11

本文共 2454 字,大约阅读时间需要 8 分钟。

题目链接:

题意:有A,B,C三个人物要分配个N个宇航员,每个宇航员恰好要分配一个任务,设平均年龄为X,只有年龄大于或等于X的宇航员才能分配任务A。只有年龄严格小于X的宇航员才能分配任务B。而任务C没有限制。有M对宇航员相互讨厌,因此不能分配到同一任务。编程找出一个满足上述所有要求的任务分配方案。

 

分析:

2-SAT。

建图:

肯定是不能同时去 C 的

 

 

同一类的话:

 

那么就是2a或者2b了,到底是哪个,就得看年龄了。

#include
#include
#include
#include
using namespace std; const int maxn = 100000 + 5; struct TwoSAT{ int n; vector
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)); } // x = xval or y = yval 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; }}; int n, m, total_age, age[maxn]; int is_young(int x){ return age[x] * n < total_age;} TwoSAT solver; int main(){ while(scanf("%d%d", &n, &m) == 2 && n && m) { total_age = 0; for(int i = 0; i < n; i++) { scanf("%d", &age[i]); total_age += age[i]; } solver.init(n); for(int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); a--; b--; if(a == b) continue; solver.add_clause(a, 1, b, 1); // 不能同去任务C if(is_young(a) == is_young(b)) // 同类宇航员 solver.add_clause(a, 0, b, 0); // 不能同去任务A或者任务B } if(!solver.solve()) printf("No solution.\n"); else for(int i = 0; i < n; i++) if(solver.mark[i*2]) printf("C\n"); // x[i]=false,去任务C else if(is_young(i)) printf("B\n"); // x[i]=true的年轻宇航员去任务B else printf("A\n"); // x[i]=true的年长宇航员去任务A } return 0;}

 

转载于:https://www.cnblogs.com/TreeDream/p/6103757.html

你可能感兴趣的文章
接口实现观察者模式
查看>>
四则运算完结篇
查看>>
Objective-C中的类目,延展,协议
查看>>
Python标准模块--Iterators和Generators
查看>>
Introduction Sockets to Programming in C using TCP/IP
查看>>
PHP 简单实现webSocket
查看>>
zookeeper部署搭建
查看>>
navigationController pop回之前控制器
查看>>
汇编语言实验一
查看>>
Web.config配置文件详解(新手必看)
查看>>
selenide总结
查看>>
selenium--控制浏览器和简单元素操作
查看>>
android spannableString 替换 textview 中部分文字
查看>>
java 引用
查看>>
关于Spring注解@Async引发其他注解失效
查看>>
关于学习的一些感悟
查看>>
算法提高 概率计算
查看>>
UVa 12716 - GCD XOR(筛法 + 找规律)
查看>>
Spring Cloud学习资料
查看>>
制作无广告启动盘
查看>>