uva1609 Foul Play
思维 创造条件使一轮比赛之后仍满足1号打败至少一半,并剩下至少一个t'
紫书上的思路很清晰
阶段1,3保证黑色至少消灭1半
#include<cstdio>
#include<vector>
using namespace std; const int maxn = + ;
char table[maxn][maxn]; int main() {
int n;
while(scanf("%d", &n) == ) {
for(int i = ; i <= n; i++) scanf("%s", table[i]+); vector<int> win, lose; // teams that team 1 win/lose against.
for(int i = ; i <= n; i++)
if(table[][i] == '') win.push_back(i);
else lose.push_back(i); int nt = n; while(nt > ) {
vector<int> win2, lose2, final; // phase 3/4 // Phase 1
for(int i = ; i < lose.size(); i++) {
int tlose = lose[i];
bool matched = false;
for(int j = ; j < win.size(); j++) {
int& twin = win[j];
if(twin > && table[twin][tlose] == '') { //尽量通过配对消灭黑
printf("%d %d\n", twin, tlose);
win2.push_back(twin); // go to the next round
twin = ; // not available 本轮已经配对
matched = true;
break;
}
}
if(!matched) final.push_back(tlose); // to phase 3/4
} // Phase 2
bool first = true;
for(int i = ; i < win.size(); i++) {
int twin = win[i];
if(twin > ) {
if(first) { printf("1 %d\n", twin);first = false; }
else final.push_back(twin);
}
} // Phase 3/4
for(int i = ; i < final.size(); i += ) { //3,4阶段可以一起处理
printf("%d %d\n", final[i], final[i+]);
int keep = final[i];
if(table[final[i+]][keep] == '') keep = final[i+];
if(table[][keep] == '') win2.push_back(keep);
else lose2.push_back(keep);
}
win = win2;
lose = lose2;
nt >>= ;
}
}
return ;
}
uva1609 Foul Play的更多相关文章
- UVa 1609 (博弈) Foul Play
姑且把它归类为一道博弈吧,毕竟这也是在找必胜方案. 十分有意思的一道题目,设计一种方案让你支持的1队获胜. 题目给出了两个很重要的条件: 1队能打败至少一半的队伍 对于1队不能打败的黑队,一定存在一个 ...
- UVa 1609 - Foul Play
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
题意:有n支队伍(n是2的整数幂,2<=n<=4),打淘汰赛,胜者进入下一轮,其中1号队伍能打败至少一半的队伍,对于它不能打败的队伍l,一定存在一支它能够打败的队伍w,使得w能直接打败l, ...
- 初涉java库--ArrayList
我的车就差一个轮子啦,造好轮子,我就飞上天与太阳肩并肩啦,想想都激动.什么你要自己造轮子,是不是傻,商店里不都是别人造好的吗,又好又方便,只需一点money,你没有money,那你只能做个安静的美男子 ...
- TJI读书笔记16-异常处理
TJI读书笔记16-异常处理 概念 基本异常情形 异常的捕获 自定义异常 异常说明 捕获所有异常 栈轨迹 重新抛出异常 Java标准异常 使用finally 异常的限制 构造器 异常的匹配 其他乱七八 ...
- Manifesto of the Communist Party
A spectre is haunting Europe – the spectre of communism. All the powers of old Europe have entered i ...
- linux-菜鸟新手命令(1)
1. ls命令 ls命令是列出目录内容(List Directory Contents)的意思.运行它就是列出文件夹里的内容,可能是文件也可能是文件夹. root@tecmint:~#ls Andro ...
- Java编程思想学习(九) 异常处理
java的异常处理机制可以使程序有极好的容错性,让程序更加的健壮.所谓的异常,就是指的阻止当前方法或作用域继续执行的问题,,当程序运行时出现异常时,系统就会自动生成一个Exception对象来通知程序 ...
- 使用 Python 抓取欧洲足球联赛数据
Web Scraping在大数据时代,一切都要用数据来说话,大数据处理的过程一般需要经过以下的几个步骤 数据的采集和获取 数据的清洗,抽取,变形和装载 数据的分析,探索和预测 ...
随机推荐
- 聊聊Spring中的工厂
BeanFactory是Spring IOC容器的根接口,定义了Bean工厂的最基础的功能特性,比如根据name获取指定bean等,根据不同用途它的子接口又对它的功能进行细化,比如是否是可列表的,是否 ...
- 各浏览器的userAgent对照表
IE Mozilla/4.0 (compatible; MSIE 8.0; Windows NT6.0) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT5 ...
- rbenv的使用
创建: 2017/09/05 更新: 2018/02/03 增加更新rbenv和获取list没有的版本 更新: 2018/02/25 把path里面[个人主机名]全部替换为[主机名] 更新: 2018 ...
- 51nod1256【exgcd求逆元】
思路: 把k*M%N=1可以写成一个不定方程,(k*M)%N=(N*x+1)%N,那么就是求k*M-N*x=1,k最小,不定方程我们可以直接利用exgcd,中间还搞错了: //小小地讲一下exgcd球 ...
- Codeforces gym 101061 G【递推公式+逆元】
题意: 就是n复制m次,然后数mod1e9+7; 思路: 案例:31*10^6 + 31*10^4 + 31*10^2 + 31*10^0 所以就是一个等比数列,然后整理一下就是n*(10^(m*le ...
- 3DMAX 合并镜像物体
如果镜像文件是实例,那么就不能用附加选项,所以可以先删除一半,再copy镜像出来,然后点选可编辑网格,在一个物体上选附加,再点选另一半即可
- c#删除指定文件夹中今天之前的文件
1.说明 使用Directory类对指定文件夹下的今天或者更早日期之前的文件进行删除.原文链接:http://www.cnblogs.com/lengzhan/p/6423943.html 2.代码 ...
- TensorFlow图像处理函数
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 图像编码处理+图像大小调整+图像翻转+图像色彩调整+处理标注框 #!/usr/bin/env python # - ...
- class JsonItemExporter(BaseItemExporter):
class JsonItemExporter(BaseItemExporter):这个类的实现和几年前的实现有了点小变化,主要就是是否添加换行
- 在IDEA中使用JSP中的out内置对象,out.println()——println红色解决方法
今天在学习JSP的时候,在jsp中使用out内置对象,开发工具用的是IDEA,结果如下图所示 郁闷了半天找度娘,可能关键字输的不准确,乱七八糟的方法一大堆,什么加依赖啊啥的,反正都不管用,最后找到一篇 ...