题意:有n支队伍(n是2的整数幂,2<=n<=4),打淘汰赛,胜者进入下一轮,其中1号队伍能打败至少一半的队伍,对于它不能打败的队伍l,一定存在一支它能够打败的队伍w,使得w能直接打败l,求一种方案保证1号队伍必胜。

队伍分类:不能直接打败的队伍是黑色队伍,能直接打败且能打败黑色队伍的是灰色队伍。

这里直接给出算法描述了:

阶段1:贪心,每个不能直接打败的队伍,选一个没有匹配的能打败它的灰色队伍。

阶段2:对于剩下的黑色队伍,任意匹配,可能会剩下一个。

阶段3:找一个能直接打败的队伍和1号匹配

阶段4:剩下的其他队伍任意匹配。

对于进阶的队伍,仍然会满足之前的条件。直到1号队伍胜利为止。

正确性请参考紫书。手写了个vec,感觉效率不比stl快多少,可能数据比较少吧。。。下标还写错了一发,尴尬。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = ;
  4.  
  5. char G[maxn][maxn];
  6. int vec[][maxn];
  7.  
  8. int main()
  9. {
  10. // freopen("in.txt","r",stdin);
  11. int n, *phase = vec[];
  12. while(~scanf("%d",&n)){
  13. for(int i = ; i < n; i++) scanf("%s",G[i]);
  14.  
  15. int *win = vec[],*lose = vec[],sz1= ,sz2 = ;
  16. for(int i = ; i < n; i++){
  17. if(G[][i] == '') win[sz1++] = i;
  18. else lose[sz2++] = i;
  19. }
  20. int N = n, s = ;
  21. while(N > ){
  22. s ^= ;
  23. int *win2 = vec[s+], *lose2 = vec[s+], sz3 = ,sz4 = ;
  24. int sz5 = ;
  25. for(int i = ; i < sz2; i++){
  26. int tlose = lose[i];
  27. int j = ;
  28. for(; j < sz1; j++){
  29. int &twin = win[j];
  30. if(twin > && G[twin][tlose] == '') {
  31. printf("%d %d\n",twin+,tlose+);
  32. win2[sz3++] = twin;
  33. twin = ;
  34. break;
  35. }
  36. }
  37. if(j == sz1) phase[sz5++] = tlose;
  38. }
  39.  
  40. while(sz5>){
  41. int &a = phase[sz5-], &b = phase[sz5-];
  42. printf("%d %d\n",a+,b+);
  43. if(G[a][b] == '') lose2[sz4++] = a;
  44. else lose2[sz4++] = b;
  45. sz5 -= ;
  46. }
  47. bool flag = sz5 == ;
  48. int i = ;
  49. for(; i < sz1; i++) if(win[i]>) { printf("1 %d\n",win[i++]+); break; }
  50. for(; i < sz1; i++) if(win[i]>) { phase[sz5++] = win[i]; }
  51.  
  52. i = ;
  53. if(flag) {
  54. int &a = phase[i], &b = phase[i+];
  55. if(G[a][b] == '') {
  56. lose2[sz4++] = a;
  57. }else {
  58. win2[sz3++] = b;
  59. }
  60. printf("%d %d\n",a+,b+);
  61. i += ;
  62. }
  63.  
  64. for(; i < sz5; i += ){
  65. int &a = phase[i], &b = phase[i+];
  66. if(G[a][b] == '') {
  67. win2[sz3++] = a;
  68. }else {
  69. win2[sz3++] = b;
  70. }
  71. printf("%d %d\n",a+,b+);
  72. }
  73. sz1 = sz3; sz2 = sz4;
  74. win = win2; lose = lose2;
  75. N >>= ;
  76. }
  77. }
  78. return ;
  79. }

UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)的更多相关文章

  1. UVa 1609 - Foul Play

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. java面试-公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解

    一.公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解 公平锁:多个线程按照申请的顺序来获取锁. 非公平锁:多个线程获取锁的先后顺序与申请锁的顺序无关.[ReentrantLock 默认非公平.s ...

  3. UVa 1609 (博弈) Foul Play

    姑且把它归类为一道博弈吧,毕竟这也是在找必胜方案. 十分有意思的一道题目,设计一种方案让你支持的1队获胜. 题目给出了两个很重要的条件: 1队能打败至少一半的队伍 对于1队不能打败的黑队,一定存在一个 ...

  4. 紫书 例题8-17 UVa 1609 (构造法)(详细注释)

    这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...

  5. Uva 1609 Feel Good

    题面:给出长度为n的数列,然后算出其区间和乘区间最小数所能得到的最大值,并且输出区间 样例输入: 6 3 1 6 4 5 2 样例输出: 60 3 5 原题链接:https://vjudge.net/ ...

  6. UVA - 12627 Erratic Expansion(奇怪的气球膨胀)(递归)

    题意:问k小时后,第A~B行一共有多少个红气球. 分析:观察图可发现,k小时后,图中最下面cur行的红气球个数满足下式: (1)当cur <= POW[k - 1]时, dfs(k, cur) ...

  7. 【C/C++】例题 4-2 刽子手游戏/算法竞赛入门经典/函数和递归

    [题目] 猜单词游戏. 计算机想一个单词让你猜,你每次猜一个字母. 如果单词里有那个[字母],[所有该字母会显示出来]. 如果没有那个字母,算猜错一次.[最多只能猜错六次] 猜一个已经猜过的字母也算错 ...

  8. 中式台球 规则 ( ChinaBilliards )

    中式台球比赛规则 中式台球兴起于上世纪八十年代末,之前叫法有“中式8球”.“中式9球”.“十六彩”.“美式落袋”.“普尔“.”八球””等等.中国台球协会于2012年宣布统一该项运动称呼,定名为“中式台 ...

  9. TCG卡牌游戏研究:《炉石战记:魔兽英雄传》所做的改变

    转自:http://www.gameres.com/665306.html TCG演进史 说到卡牌游戏,大家会联想到什么呢? 是历史悠久的扑克牌.风靡全球的<MTG 魔法风云会>与< ...

随机推荐

  1. java之数学方法

    参考http://how2j.cn/k/number-string/number-string-math/319.html java.lang.Math提供了一些常用的数学运算方法,并且都是以静态方法 ...

  2. Spring入门第八课

    看如下代码 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  3. WPF之触发器

    简单触发器<Window x:Class="WpfApp.Window1" xmlns="http://schemas.microsoft.com/winfx/20 ...

  4. 从RAID看垂直伸缩到水平伸缩的演化

    磁盘的读写过程,最消耗时间的地方就是在磁盘中磁道寻址的过程,而一旦寻址完成,写入数据的速度很快. 连续写入:写入只寻址一次 存储位置与逻辑位置相邻 不用多次寻址 随机写入:每写一次 便寻址一次 增加了 ...

  5. 洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)

    传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接 ...

  6. 坑爹的 Java 可变参数,把我整得够惨。。

    最近在写一个功能点,用了 Java 中的可变参数,真是把我搞得够惨.. 什么是可变参数? 就是方法参数用 Object... args 三个点形式,一个参数可以接收多个参数. 实际的代码就不帖了,来看 ...

  7. SequoiaDB培训视频

    很久之前录制的SequoiaDB培训视频,现在都放上百度云盘了,感兴趣的同学可以看看. 第一讲:图形界面-安装前准备 链接: https://pan.baidu.com/s/1d2B3qUYqtKrE ...

  8. EXP-00000: Message 0 not found; No message file for product=RDBMS, facility=EXP问题的解决方案

    EXP-00000: Message 0 not found; No message file for product=RDBMS, facility=EXP 最近在服务器上准备做一个批处理,定时备份 ...

  9. GZS与小公园(DFS)

    Description 某天GZS漫步在学校新建的小公园,他发现那里建成了一些水池和小河道.我们暂且把它们统一看成水池.假设公园旁有一张小公园的地图,上面仅标识了此处是否是水池,你能帮GZS计算出该地 ...

  10. jdbc查询

    import java.util.ArrayList; import java.util.List; import org.springframework.jdbc.core.BeanProperty ...