【问题描述】

有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号。对1<i<n的i来说,i号的左边是i+1号,右边是i-1号。1号的右边是n号,n号的左边是1号。每一轮游戏时,主持人指定一个还坐在桌边的人(假设是i号),让他向坐在他左边的人(假设是j号)发起挑战,如果挑战成功,那么j离开圆桌,如果挑战失败,那么i离开圆桌。当圆桌边只剩下一个人时,这个人就是最终的胜利者。

事实上,胜利者的归属是与主持人的选择息息相关的。现在,你来担任圆桌游戏的主持人,并且你已经事先知道了对于任意两个人i号和j号,如果i向j发起挑战,结果是成功还是失败。现在你想知道,如果你可以随意指定每轮发起挑战的人,哪些人可以成为最终的胜利者?

【输入】

第一行包含一个整数n,表示参加游戏的人数;

接下来n行,每行包含n个数,每个数都是0或1中的一个,若第i行第j个数是1,表示i向j发起挑战的结果是成功,否则表示挑战结果是失败。第i行第i列的值一定为0。

【输出】

一行,包含若干个数,表示可能成为最终胜利者的玩家的标号。标号按从小到大的顺序输出,相邻两个数间用1个空格隔开。

【输入输出样例1】

game.in

game.out

3

0 1 0

0 0 1

0 1 0

1 3

见选手目录下的game / game1.in与game / game1.out

【输入输出样例1说明】

先指定2号向3号发起挑战,3号离开;再指定1号向2号发起挑战,2号离开。此时1号是最终胜利者。

先指定1号向2号发起挑战,2号离开;再指定1号向3号发起挑战,1号离开。此时3号是最终胜利者。

无论如何安排挑战顺序,2号都无法成为最终胜利者。

【输入输出样例2】

见选手目录下的game / game2.in与game / game2.out

【数据规模与约定】

对于30%的数据,n≤7

对于100%的数据,n≤100

/*
先说说我的90分算法,o(玄学),而且时间复杂度与最终人数有关,设f[i][j][k]表示区间i……j中第k个可能获胜的人是谁,然后记录一下,每次把两个区间合并就可以了
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int maxn = ;
int dp[maxn*][maxn*][maxn],cnt[maxn*][maxn*];
int n,a[maxn][maxn],cir;
bool vis[maxn*][maxn*][maxn],ans[maxn];
inline void psh(int l,int r,int v){
if(vis[l][r][v]) return;
vis[l][r][v] = true;
dp[l][r][++cnt[l][r]] = v;
if(r - l + == cir) ans[v] = true;
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
cin>>n;
for(int i = ;i <= n;i++){
for(int j = ;j <= n;j++){
scanf("%d",&a[i][j]);
}
}
for(int i = ;i <= n ;i++){
dp[i][i][] = dp[i+n][i+n][] = i;
cnt[i][i] = cnt[i+n][i+n] = ;
}
cir = n;
n = *n + ;
int ft,fe;
for(int l = ;l <= cir;l++){
for(int i = ;i <= n - l + ;i++){
int j = i + l - ;
for(int k = i;k < j;k++){
for(int t1 = ;t1 <= cnt[i][k];t1++){
for(int t2 = ;t2 <= cnt[k+][j];t2++){
ft = dp[i][k][t1];
fe = dp[k+][j][t2];
if(a[ft][fe]) psh(i,j,ft);
else psh(i,j,fe);
if(l == cir){
if(a[fe][ft]) psh(i,j,fe);
else psh(i,j,ft);
}
}
}
}
}
}
for(int i = ;i <= cir;i++){
if(ans[i]) printf("%d ",i);
}
return ;
}
/*
标算:f[i][j]==true表示i与j可能相邻,每次枚举区间内最后一个被淘汰的人,若f[i][i+n]为true则i可能获胜!
*/
#include <cstdio>
int n,i,j,k,a[][],q[];
bool f[][],o; int main()
{
freopen("game.in", "r", stdin);
freopen("game.out", "w", stdout); scanf("%d", &n);
for (i=; i<=n; ++i)
for (j=; j<=n; ++j) scanf("%d", &a[i][j]); for (i=; i<=n; ++i) q[i] = q[i+n] = i;
for (i=; i<n+n; ++i) f[i][i+] = true; for (i=n+n-; i>=; --i)
for (j=i+; j<=n+n; ++j) for (k=i+; k<j; ++k)
if (f[i][k] && f[k][j] && (a[q[i]][q[k]] || !a[q[k]][q[j]]))
{
f[i][j] = true;
break;
} for (i=; i<=n; ++i)
if (f[i][i+n])
{
if (o) printf(" ");
printf("%d", i);
o = true;
}
printf("\n");
return ;
}

清北学堂模拟day6 圆桌游戏的更多相关文章

  1. 清北学堂模拟day6 兔子

    [问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子 ...

  2. 清北学堂模拟day6 花

    [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...

  3. 清北学堂模拟赛d6t5 侦探游戏

    分析:简化一下题意就是给任意两对点连一条权值为0的边,求出每次连边后最小生成树的权值和*2/(n - 1) * n. 每次求最小生成树肯定会爆炸,其实每次加边只是会对最小生成树上的一条边有影响,也就是 ...

  4. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  5. 清北学堂模拟day4 捡金币

    [问题描述]小空正在玩一个叫做捡金币的游戏.游戏在一个被划分成 n行 n列的网格状场地中进行.每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化. 小空的任务就是在网格中移动,拾取尽量多的 ...

  6. 清北学堂模拟赛d6t6 棋盘迷宫

    3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...

  7. 清北学堂模拟赛d1t6 或和异或(xor)

    题目描述 LYK最近在研究位运算,它研究的主要有两个:or和xor.(C语言中对于|和^) 为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组.它第一次先对所有相邻两个数执行or操作,得到一 ...

  8. 清北学堂模拟赛d4t1 a

    分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...

  9. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

随机推荐

  1. python反射

    python反射 python的反射是基于字符串的形式去对象(模块)中操作其成员.此操作是动态的,常用于web开发中url参数中对应模块或者函数的反射. 下面开始具体说明: 场景需求: 我的pytho ...

  2. python时间模块-time和datetime

    时间模块 python 中时间表示方法有:时间戳,即从1975年1月1日00:00:00到现在的秒数:格式化后的时间字符串:时间struct_time 元组. struct_time元组中元素主要包括 ...

  3. AngularJs angular.bind、angular.bootstrap、angular.copy

    angular.bind 返回一个调用self的函数fn(self代表fn里的this).可以给fn提供参数args(*).这个功能也被称为局部操作,以区别功能. 格式:angular.bind(se ...

  4. POJ 2823 Sliding Window + 单调队列

    一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1)   从队首删除 (2)   从队尾删除 (3)   从队尾插入 (4)   ...

  5. 解决Eclipse 项目报错:Unbound classpath container

    Eclipse出现下面两条报错: The project cannot be built until build path errors are resolved HelloWord Unknown ...

  6. 数据结构与算法分析–Minimum Spanning Tree(最小生成树)

    给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...

  7. 【Beta】第二次任务发布

    后端 了解社区新建文章.添加评论(回复)的机制.整理成API文档,包括如何请求新建文章.新建评论(回复).如何获取文章内容和评论内容. 验收条件:文档PM要能看懂. 前端 微调数据输入部分的布局和操作 ...

  8. Linux 平台PostGIS安装

    1.前提条件: postgresql 9.6.1 已经通过源码方式安装完成并可成功运行. 2. other OS packets OS: CentOS 6.4 X64 X64: libxml2-dev ...

  9. 常见linux命令释义(第五天)——shell变量学习

    由于时间有限,我写这篇博客的时间上限为30分钟.仅作为学习笔记而用,内容会尽量的讲清楚.如果讲的不清楚,你来打我啊! 玩笑开过,正式开始今天的学习. linux系统的中一些命令是在/bin下,这个是一 ...

  10. easyUI创建dialog弹框

    1.在当前页面必须有一个DIV <!-- 保证金明细的详情列表显示 --> <div id="dialog-alarm-detail"></div&g ...