POJ1058 The Gourmet Club
题目来源:http://poj.org/problem?id=1058
题目大意:ACM城的美食俱乐部有16位成员。他们连续了当地的法国餐厅Chatrau Java来安排连续5天的晚餐。晚餐时他们每4人1桌,共4桌。他们希望5次晚餐中,每个成员都跟其他的所有成员恰好同桌进餐一次。餐厅主人Maitre D'先生被安排来完成俱乐部成员的座位安排和调度。Maitre D'做了前三天的座位安排,保证了每个成员没有与其他的任一个成员同桌过两次,但不幸的是Maitre D'先生在第四天不见了,只留下了前三天座位安排的记录。现在要请你帮忙看能够合理地安排接下来两天中各位成员的座位,使得5天里每个成员与其他各成员恰好同桌一次。下面是Maitre D'先生留下的记录的样例:
ABCD EFGH IJKL MNOP
AEIM BFJN CGKO DHLP
AFKP BGLM CHIN DEJO
俱乐部成员编号为A,B,C,...,P。
每一行代表一天晚餐的座位安排,连在一起的4个编号表示该4个人同桌。
输入:每个数据集含3行,每行4个块,每个块4个字母。所有字母都为大写。块之间用空格隔开。数据集之间用空行隔开。
输出:若能找到一个可行的后两天的座位安排,则按顺序输出整个5天的安排,若不可能完成安排,则输出"It is not possible to complete this schedule." 数据集之间用空行隔开。
Sample Input
ABCD EFGH IJKL MNOP
AEIM BFJN CGKO DHLP
AFKP BGLM CHIN DEJO
Sample Output
It is not possible to complete this schedule.
解题思路:
总人数16人,每个人要求与其他每个人都恰好同桌一次。
那么在前三天之后,每个人都还有6个人没有同桌过。
假设与A没有同桌过的6人组成集合S(A),假定B属于S(A), 未与B同桌过的人组成集合S(B). A与B必须要同桌一次,而他们同桌时还需要再找两个与A和B都没有同桌过的人来凑数。
那么如果S(A)∩S(B)少于2人,则无法凑出一桌,说明无法达到目标。
如果S(A)∩S(B)大于2人,那么假定选出两人凑成这一桌,那么至少还剩下一人需要在另一天里即与A同桌也与B同桌才可能满足与每个人都同桌过,而A和B已经同桌过了,所以也无法达到目标。
所以只有S(A)与S(B)的交集恰好为2人时可能达成目标。由此规则,一直凑桌就可以了。
代码如下,最开始用了两个goto语句写的,后来改为下面不含goto的版本,可是代码长了好多(=。=).
//////////////////////////////////////////////////////////////////////////
// POJ1058 The Gourmet Club
// Memory: 180K Time: 0MS
// Language: C++ Result: Accepted
////////////////////////////////////////////////////////////////////////// #include <iostream>
#include <set>
#include <algorithm> using namespace std; int graph[][]; //graph[i][j]为0表示该两人未同桌过,为1表示已同桌过
char schedule[][][]; //schedule[i][j][k]表示第 i + 1 天第 j + 1 桌的第 k + 1 个人 int main(void) {
while (true) {
memset(graph, , sizeof(graph)); //读入前三天的座位安排
for (int i = ; i < ; ++i) {
for (int j = ; j < ; ++j) {
for (int k = ; k < ; ++k) {
if (!(cin >> schedule[i][j][k])) {
return ;
}
}
//用graph记录同桌关系
for (int p = ; p < ; ++p) {
for (int q = ; q < ; ++q) {
graph[schedule[i][j][p] - 'A'][schedule[i][j][q] - 'A'] = ;
graph[schedule[i][j][q] - 'A'][schedule[i][j][p] - 'A'] = ;
}
}
}
} bool flag = true;
for (int i = ; flag && i < ; ++i) {
//第 i + 1 天
bool settled[]; //记录已安排座位的人
for (int t = ; t < ; ++t) {
settled[t] = false;
}
//凑前三桌的人
for (int j = ; flag && j < ; ++j) {
int a = -, b = -, c = -, d = -;
set<int> sa, sb, si;
set<int>::iterator itr;
itr = si.begin();
for (a = j; flag && a < ; ++a) {
if (settled[a] == false) {
//找出一个该日未落座的人a
for (int t = a + ; flag && t < ; ++t) {
//未与a同座过的人组成sa
if (!settled[t] && !graph[a][t]) {
sa.insert(t);
}
}
if (sa.size() >= ) {
b = *(sa.begin());
//未与b同座过的组成sb
for (int t = a; t < ; ++t) {
if (!settled[t] && !graph[b][t]) {
sb.insert(t);
}
}
if (sb.size() < ) {
flag = false;
}
} else {
flag = false;
}
if (flag) {
//求交集并判断交集人数
set_intersection(sa.begin(), sa.end(), sb.begin(), sb.end(), inserter(si, itr));
int k;
if (si.size() == ) {
for (k = , itr = si.begin(); itr != si.end(); itr++, ++k) {
schedule[i][j][k] = (*itr) + 'A';
}
schedule[i][j][] = a + 'A';
schedule[i][j][] = b + 'A';
c = schedule[i][j][] - 'A';
d = schedule[i][j][] - 'A';
graph[a][b] = graph[b][a] = graph[a][c] = graph[c][a] = graph[a][d]
= graph[d][a] = graph[b][c] = graph[c][b] = graph[c][d]
= graph[d][c] = ;
settled[a] = settled[b] = settled[c] = settled[d] = true;
} else {
flag = false;
}
}
break;
}
}
}
//剩下的为第四桌
for (int t = , p = ; flag && t < ; ++t) {
if (!settled[t]) {
schedule[i][][p++] = t + 'A';
}
}
} //输出
if (flag) {
for (int i = ; i < ; ++i) {
for (int j = ; j < ; ++j) {
for (int k = ; k < ; ++k) {
cout << schedule[i][j][k];
}
if (j != ) {
cout << " ";
}
}
cout << endl;
}
} else {
cout << "It is not possible to complete this schedule." << endl;
}
}
return ;
}
POJ1058 The Gourmet Club的更多相关文章
- POJ题目排序的Java程序
POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...
- 【CodeForces 589F】Gourmet and Banquet(二分+贪心或网络流)
F. Gourmet and Banquet time limit per test 2 seconds memory limit per test 512 megabytes input stand ...
- Malek Dance Club(递推)
Malek Dance Club time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- 网络流CodeForces. Original 589F:Gourmet and Banquet
A gourmet came into the banquet hall, where the cooks suggested n dishes for guests. The gourmet kno ...
- Trunk Club:颠覆男士时装零售的创业公司_第1页_福布斯中文网
Trunk Club:颠覆男士时装零售的创业公司_第1页_福布斯中文网 Trunk Club:颠覆男士时装零售的创业公司
- 二度云抢先成为首批中国工信部(.vip/.xyz/.club)域名注册管理机构
今天,工信部官网的公示文件显示,新通用顶级域名.vip..xyz以及.club域名注册局已正式获得工信部审批,成为中国境内合法的顶级域名注册管理机构,这标志着.vip..xyz以及.club域名成为首 ...
- Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)
Problem Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...
- Lending Club贷款数据分析
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- Lending Club—构建贷款违约预测模型
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
随机推荐
- docker 笔记 (5)常用命令
images 显示镜像列表 history 显示镜像构建历史 commit 从容器创建新镜像 build 从 Dockerfile 构建镜像 tag 给镜像打 ta ...
- (修改)oracle11g监听多台主机配置,用pl/sql连接操作多个数据库详解
很多朋友在开发项目中并不是每个人用一个数据库,而是有单独的一台主机作为开发的数据库服务器,这样,就需要我们的开发人员去连接它. 首先是进入oracle的 Net Mananger:
- LVS+keepalived搭建负载均衡
安装环境:环境 centos4.4 LB:192.168.2.158(VIP:192.168.2.188) real-server1:192.168.2.187 real-server2:192.16 ...
- 磨刀——python及相关工具
1.python语言包 1.1去https://www.python.org/,在download栏下载最新版python2或者python3 tips:1.点击下载会很慢,推荐:迅雷,百度云盘下载, ...
- SQL serve 数据库--视图、事物、分离附加、备份还原
视图是数据库中的一种虚拟表,与真实的表一样,视图包含一系列带有名称的行和列数据.行和列数据用来自定义视图的查询所引用的表,并且在引用视图时动态生成. 视图只能用来查询,不能增删改:不允许出现重复列 ...
- 基于GStreamer编写Mp3播放器
一.简介 作者系统为CentOS6,本文在此基础上对Mp3播放器进行开发,需要使用mp3解码库libmad和gstreamer0.10-plugins-ugly,详细步骤如下. 二.操作步骤 1) ...
- hdu6357 Hills And Valleys
传送门 题目大意 给定一个序列A,求翻转A中一个区间之后的最长不降子序列的长度即翻转的区间 分析 发现直接枚举翻转的区间的话是无论如何都不行的,于是有一个非常神奇的做法.我们再设一个序列B = {0, ...
- bzoj2751 容易题
传送门 题目 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我 ...
- Qemu虚拟机 玩树莓派最新版系统 (截止2017-04-10)
Qemu虚拟机可以玩 树莓派,大家都知道了吧.可是网上的教程好老,都是2012年的.我按照教程下载了最新版版本的树莓派系统怎么也跑不起来. 研究了好久,终于找到一个简单的方法,特意分享出来.转载请注意 ...
- Gremlin:图遍历语言
Gremlin简介 Gremlin是Apache TinkerPop 框架下的图遍历语言.Gremlin是一种函数式数据流语言,可以使得用户使用简洁的方式表述复杂的属性图(property graph ...