UVA1609-Foul Play(构造+递归)
Accept: 101 Submit: 514
Time Limit: 3000 mSec
Problem Description
Input
For each test case, the input is as follows:
• One line containing the number of teams n, where n is a power of two and 2 ≤ n ≤ 1024. Teams are numbered from 1 to n, where team 1 is your favourite team.
• n lines, each containing a string of n binary digits. The k-th digit on the j-th line is ‘1’ if team j would certainly win from team k, otherwise it is ‘0’. A team cannot play against itself, therefore the j-th digit on the j-th line is ‘0’. If j ̸= k, the k-th digit on the j-th line is different from the j-th digit on the k-th line.
Output
Sample Input
0110
0011
0000
1010
8
00111010
10101111
00010010
01000101
00110010
10101011
00010000
10101010
Sample Output
1 3
2 4
1 2
1 5
3 7
4 8
2 6
1 3
4 2
1 4
题解:这个题的构造比较难,我是想不到,构造出来之后的递归就相对比较简单了。构造的方式分为四个阶段:
1、把满足条件的队伍A和B配对,其中1打不过A,1能打过B,并且B能打过A.
2、把1和剩下的它能打过的队伍配对.
3、把1打不过的队伍相互配对.
4、把剩下的队伍配对.
能够证明按照这样的策略打过一轮之后,剩下的队伍还满足初始条件,因此可以递归求解。(构造太巧妙orz)
#include <bits/stdc++.h> using namespace std; const int maxn = ; int n;
char gra[maxn][maxn];
bool vis[maxn], have_failed[maxn]; void dfs(int m) {
if (m == ) return; memset(vis, false, sizeof(vis)); for (int i = ; i <= n; i++) {
if (have_failed[i] || vis[i]) continue;
if (gra[][i] == '') {
for (int j = ; j <= n; j++) {
if (have_failed[j] || vis[j]) continue;
if (gra[][j] == '' && gra[j][i] == '') {
vis[j] = vis[i] = true;
have_failed[i] = true;
printf("%d %d\n", i, j);
break;
}
}
}
} for (int i = ; i <= n; i++) {
if (have_failed[i] || vis[i]) continue;
if (gra[][i] == '') {
vis[i] = true;
have_failed[i] = true;
printf("%d %d\n", , i);
break;
}
} int flag = , pre = ;
for (int i = ; i <= n; i++) {
if (have_failed[i] || vis[i]) continue;
if (gra[][i] == '') {
if (!flag) {
flag = ;
pre = i;
}
else {
flag = ;
vis[i] = vis[pre] = true;
printf("%d %d\n", pre, i);
if (gra[pre][i] == '') have_failed[pre] = true;
else have_failed[i] = true;
}
}
} flag = ;
for (int i = ; i <= n; i++) {
if (have_failed[i] || vis[i]) continue;
if (!flag) {
flag = ;
pre = i;
}
else {
flag = ;
vis[i] = vis[pre] = true;
printf("%d %d\n", pre, i);
if (gra[pre][i] == '') have_failed[pre] = true;
else have_failed[i] = true;
}
} dfs(m >> );
} int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
while (~scanf("%d", &n)) {
memset(have_failed, false, sizeof(have_failed));
for (int i = ; i <= n; i++) {
scanf("%s", gra[i] + );
} dfs(n);
}
return ;
}
UVA1609-Foul Play(构造+递归)的更多相关文章
- uva1609 Foul Play
思维 创造条件使一轮比赛之后仍满足1号打败至少一半,并剩下至少一个t' 紫书上的思路很清晰阶段1,3保证黑色至少消灭1半 #include<cstdio> #include<vect ...
- 51Nod 1013 3的幂的和 快速幂 | 乘法逆元 | 递归求和公式
1.乘法逆元 直接使用等比数列求和公式,注意使用乘法逆元 ---严谨,失细节毁所有 #include "bits/stdc++.h" using namespace std; #d ...
- MVC的Views中使用递归生成Html【转】
在开发过程中往往会有一个需求,就是将一个树状的数据结构在视图中表示出来.例如最传统的多级分类,系统中有一系列根分类,每个分类中又带有一些子分类,而我们的目标便是在页面上生成一个由ul和li嵌套组成的H ...
- leetcode bugfree note
463. Island Perimeterhttps://leetcode.com/problems/island-perimeter/就是逐一遍历所有的cell,用分离的cell总的的边数减去重叠的 ...
- 建模算法(四)——动态规划
其实我们对着规划接触的最多最熟悉,简单来说就是一个递归问题,递归问题简单的在的地方,编程实现的难度下降了,难的地方是如何构造递归,不好的地方是资源的浪费,但是有些地方编程实现的简单的优势可以无视掉他的 ...
- 77. Combinations
题目: Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For ex ...
- python实现二叉树和它的七种遍历
介绍: 树是数据结构中很重要的一种,基本的用途是用来提高查找效率,对于要反复查找的情况效果更佳,如二叉排序树.FP-树. 另外能够用来提高编码效率,如哈弗曼树. 代码: 用python实现树的构造和几 ...
- SQL递归查询知多少
最近工作中遇到了一个问题,需要根据保存的流程数据,构建流程图.数据库中保持的流程数据是树形结构的,表结构及数据如下图: 仔细观察表结构,会发现其树形结构的特点: FFIRSTNODE:标记是否为根节点 ...
- 【Sql Server】SQL SERVER 递归查询
SQL SERVER 2005之前的版本只能用函数方法实现,SQL SERVER 2005之后新增了CTE功能,可以利用CTE实现递归查询: CTE:公用表达式Common Table Express ...
随机推荐
- Add Again(重复元素排序) UVA11076
Add Again Summation of sequence of integers is always a common problem in Computer Science. Rather t ...
- Spring Boot依赖引入的多种方式
使用Spring Boot开发,不可避免的会面临Maven依赖包版本的管理. 有如下几种方式可以管理Spring Boot的版本. 使用parent继承 <?xml version=" ...
- Python中的特殊属性与方法
模块的特殊属性 __doc__ 模块的说明文档 __all__ 指明模块希望被使用的属性.类和方法 __file__ 模块所在路径 类的特殊属性 __slots__ 限制类的实例允许添加的属性,是一个 ...
- JVM相关知识
Java虚拟机学习分享最近主要在学习JVM相关知识,-知识主要来源<深入理解JAVA虚拟机>,深有感触,结合自己的理解,整理出一些经验,由于篇幅较长,就把链接帖出来,希望对大家有所帮助: ...
- Chrome开发者工具Debug入门
译者按: 手把手教你摆脱console.log,掌握高级的debug方法. 原文: Learn How To Debug JavaScript with Chrome DevTools 译者: Fun ...
- 判断文本是否溢出/hover显示全部
前言 在工作中我们经常会遇到,文字过多,需要用省略号,并且鼠标hover的时候 还需要 显示全部的文字的需求. 正文 文字过多需要用省略号的实现:上代码啦 .ellipsis { width: 100 ...
- linux查看用户、创建用户、设置密码、修改用户、删除用户命令
查看用户 /etc/passwd /etc/shadow id alex ' |passwd --stdin alex # 设置密码,不需要交互 [root@localhost ~]# tail -l ...
- CSS3使用transition属性实现过渡效果
transition属性目的是让css的一些属性(如background)的以平滑过渡的效果出现.它是一个合并属性,是由以下四个属性组合而成: transition-property:设置应用过渡的C ...
- DOM技术
DOM概述 DOM:Document Object Model(文档对象模型)(DOM核心就是 文档变对象,标签也变对象,属性也变对象,反正就是把标记文档拆散) 用来将标记型对象封装成对象,并将标记型 ...
- IO学习一(File类)
File类 1.凡是与输入.输出相关的类.接口都定义在java.io包下 2.File有构造器来创建对象,此对象对应着一个文件或文件目录 支持文件类型:.txt .avi .doc .jpg .ppt ...