清北学堂模拟day6 圆桌游戏
【问题描述】
有一种圆桌游戏是这样进行的: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 圆桌游戏的更多相关文章
- 清北学堂模拟day6 兔子
[问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子 ...
- 清北学堂模拟day6 花
[问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...
- 清北学堂模拟赛d6t5 侦探游戏
分析:简化一下题意就是给任意两对点连一条权值为0的边,求出每次连边后最小生成树的权值和*2/(n - 1) * n. 每次求最小生成树肯定会爆炸,其实每次加边只是会对最小生成树上的一条边有影响,也就是 ...
- 清北学堂模拟赛day7 数字碰撞
/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...
- 清北学堂模拟day4 捡金币
[问题描述]小空正在玩一个叫做捡金币的游戏.游戏在一个被划分成 n行 n列的网格状场地中进行.每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化. 小空的任务就是在网格中移动,拾取尽量多的 ...
- 清北学堂模拟赛d6t6 棋盘迷宫
3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...
- 清北学堂模拟赛d1t6 或和异或(xor)
题目描述 LYK最近在研究位运算,它研究的主要有两个:or和xor.(C语言中对于|和^) 为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组.它第一次先对所有相邻两个数执行or操作,得到一 ...
- 清北学堂模拟赛d4t1 a
分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...
- 清北学堂模拟赛day7 错排问题
/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...
随机推荐
- Linux Process Management && Process Scheduling Principle
目录 . 引言 . 进程优先级 . 进程的生命周 . 进程表示 . 进程管理相关的系统调用 . 进程调度 . 完全公平调度类 . 实时调度类 . 调度器增强 . 小结 1. 引言 在多处理器系统中,可 ...
- luars232库中用到的一些C API for lua
代码就不贴了,这里只是梳理一下前两篇里面忽略的一些东西,作为读代码的记录吧. 1.头文件 #include <lauxlib.h> #include <lua.h> All A ...
- jQuery知识点总结(第五天)
节点的操作和数据库操作一样,无非是增.删.改.查. 今天总结删除节点.复制节点.替换节点.与包裹节点 删除节点: 如果文档中一个元素多余,那么就需要删除掉.jQuery提供了三种删除节点的方法.分别是 ...
- 对JavaScript优化及规范的一些感想
变量...... 1.一个变量只存一种类型的数据,2.尽量减少对隐式转换的依赖,这样可增强程序的可读性,日后修改程序时不至于混乱,3.使用匈牙利命名法,4.使用局部变量时记得加 var 进行声明,不然 ...
- HTML5学习总结-04 音频&视频播放
一 音频播放 1 Audio(音频) HTML5提供了播放音频文件的标准 2 control(控制器) control属性攻添加播放,暂停和音量空间. 3 标签定义声音 <audio> 例 ...
- Python核心编程第三版第二章学习笔记
第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of ...
- TextView 选择文字
final CharSequence edit = text2.getText(); text2.setCursorVisible(true); text2.setOnTouchListener(ne ...
- squid代理服务器配置详解
root@proxy squid]# cat squid.conf## Recommended minimum configuration:#visible_hostname www.jd.com # ...
- PHP ob系列函数详解
一. 相关函数简介: 1.Flush:刷新缓冲区的内容,输出. 函数格式:flush() 说明:这个函数经常使用,效率很高. 2.ob_start :打开输出缓冲区 函数 ...
- python判断字符串
python判断字符串 s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小 ...