【问题描述】

有一种圆桌游戏是这样进行的: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. nand以及yaffs2

    用的是tiny210+1312的SDK,友善之臂给的文件系统居然有300多兆,烧写系统可是要人命了,那个等啊...所以,想着把系统给做小一点.和其他一样,我的知识仅限于理论阶段,嘿嘿.今天实践一下. ...

  2. nginx location在配置中的优先级

    location表达式类型 ~ 表示执行一个正则匹配,区分大小写~* 表示执行一个正则匹配,不区分大小写^~ 表示普通字符匹配.使用前缀匹配.如果匹配成功,则不再匹配其他location.= 进行普通 ...

  3. python 中的map(), reduce(), filter

    据说是函数式编程的一个函数(然后也有人tucao py不太适合干这个),在我看来算是pythonic的一种写法. 简化了我们的操作,比方我们想将list中的数字都加1,最基本的可能是编写一个函数: I ...

  4. 将maven工程转成dynamic web project

    http://blog.csdn.net/remote_roamer/article/details/51724378 做到最后一步就不行鸟,没有plugin........

  5. photoshop切图介绍

    第一部分:界面设置 1.点击“文件-新建”(或者ctrl+n)打开一个新建对话框.名称可随意填写.“预设”设置为自定,“宽度”一般选择1920,“单位”选为像素.“高度”可选择为2000,“单位”选为 ...

  6. 修改nginx的访问目录以及遇到的403错误修改总结

    对于这个问题困扰了我好几天,前篇文章介绍了图片服务器的使用,但是两个服务器如何进行通话访问呢,即如何通过nginx来访问ftp服务器上的资源文件呢,这里面需要修改nginx的配置文件(vi /usr/ ...

  7. wpf读取mysql字段类型为text的问题

    在读取数据库中的字段时,可能会根据环境的不同导致一些字段的读取方式不尽相同,在sql数据库中读取字段值用的最多的算是dataTable.Rows[行][列],但是到了mysql中就会有一些差别,在fl ...

  8. 自然语言15_Part of Speech Tagging with NLTK

    https://www.pythonprogramming.net/part-of-speech-tagging-nltk-tutorial/?completed=/stemming-nltk-tut ...

  9. Python学习笔记——文件写入和读取

    1.文件写入 #coding:utf-8 #!/usr/bin/env python 'makeTextPyhton.py -- create text file' import os ls = os ...

  10. Java递归算法——汉诺塔问题

    //================================================= // File Name : Tower_demo //-------------------- ...