UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)

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

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

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

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

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

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

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

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

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

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1025;

char G[maxn][maxn];
int vec[5][maxn];

int main()
{
   // freopen("in.txt","r",stdin);
    int n, *phase = vec[4];
    while(~scanf("%d",&n)){
        for(int i = 0; i < n; i++) scanf("%s",G[i]);

        int *win = vec[0],*lose = vec[2],sz1= 0,sz2 = 0;
        for(int i = 1; i < n; i++){
            if(G[0][i] == ‘1‘) win[sz1++] = i;
            else lose[sz2++] = i;
        }
        int N = n,  s = 0;
        while(N > 1){
            s ^= 1;
            int *win2 = vec[s+0], *lose2 = vec[s+2], sz3 = 0,sz4 = 0;
            int sz5 = 0;
            for(int i = 0; i < sz2; i++){
                int tlose = lose[i];
                int j = 0;
                for(; j < sz1; j++){
                    int &twin = win[j];
                    if(twin > 0 && G[twin][tlose] == ‘1‘) {
                        printf("%d %d\n",twin+1,tlose+1);
                        win2[sz3++] = twin;
                        twin = 0;
                        break;
                    }
                }
                if(j == sz1) phase[sz5++] = tlose;
            }

            while(sz5>1){
                int &a = phase[sz5-1], &b = phase[sz5-2];
                printf("%d %d\n",a+1,b+1);
                if(G[a][b] == ‘1‘) lose2[sz4++] = a;
                else  lose2[sz4++] = b;
                sz5 -= 2;
            }
            bool flag = sz5 == 1;
            int i = 0;
            for(; i < sz1; i++) if(win[i]>0) { printf("1 %d\n",win[i++]+1); break; }
            for(; i < sz1; i++) if(win[i]>0) { phase[sz5++] = win[i]; }

            i = 0;
            if(flag) {
                int &a = phase[i], &b = phase[i+1];
                if(G[a][b] == ‘1‘) {
                    lose2[sz4++] = a;
                }else {
                    win2[sz3++] = b;
                }
                printf("%d %d\n",a+1,b+1);
                i += 2;
            }

            for(; i < sz5; i += 2){
                int &a = phase[i], &b = phase[i+1];
                if(G[a][b] == ‘1‘) {
                    win2[sz3++] = a;
                }else {
                    win2[sz3++] = b;
                }
                printf("%d %d\n",a+1,b+1);
            }
            sz1 = sz3; sz2 = sz4;
            win = win2; lose = lose2;
            N >>= 1;
        }
    }
    return 0;
}
时间: 2024-09-29 02:04:31

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

UVa 1609 (博弈) Foul Play

姑且把它归类为一道博弈吧,毕竟这也是在找必胜方案. 十分有意思的一道题目,设计一种方案让你支持的1队获胜. 题目给出了两个很重要的条件: 1队能打败至少一半的队伍 对于1队不能打败的黑队,一定存在一个1队能打败的灰队,使得这支灰队能够打败黑队.也就是说1队可以通过灰队间接打败黑队 一共有2n支队伍,每轮比赛会刷掉一半的队伍,紫书上巧妙的做法就是每轮比赛后让题目给的两个性质依然成立,这样1队最终一定能胜出. 方案如下,大致分为3个阶段: 物尽其用.依次考虑每个黑队,如果有能够打败他的灰队的话,便让

Uva 1609 Feel Good

题面:给出长度为n的数列,然后算出其区间和乘区间最小数所能得到的最大值,并且输出区间 样例输入: 6 3 1 6 4 5 2 样例输出: 60 3 5 原题链接:https://vjudge.net/problem/UVA-1619 分析: 这里有两种算法,一种是O(nlogn)的,用st表+递归,另一种是O(n)的,用单调栈. 容易知道对于数列中的每一个数作为相应区间最小值时,虽然这个相应区间不一定唯一的,但是这个最大区间和一定是唯一的. 举个栗子: 对于数列{0, 0, 0, 0, 0}来说

算法竞赛入门经典_4.3_递归

看代码 #include <stdio.h> int f(int n){ return n == 0?1:f(n-1)*n; } int main() { printf("%d\n", f(5)); return 0; } 上面f函数使用了递归,递归由两部分组成,一是递归头,二是递归体. 我们使用gcc调试工具 H:\编程书籍学习\算法竞赛入门经典2代码\算法入门经典第四章>b f 'b' 不是内部或外部命令,也不是可运行的程序 或批处理文件. H:\编程书籍学习\算

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

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

iOS开发者程序许可协议

请仔细阅读下面的许可协议条款和条件之前下载或使用苹果软件.   这些条款和条件构成你和苹果之间的法律协议. 目的 你想使用苹果软件(如下定义)来开发一个或多个应用程序(如下定义)Apple-branded产品运行iOS. 苹果愿意授予您有限的许可使用苹果软件开发和测试您的应用程序在本协议规定的条款和条件. 开发的应用程序在此协议下可以分布在四个方面:(1)通过应用程序商店,如果选择苹果,(2)通过VPP / B2B项目网站,如果选择苹果,(3)在一个有限的基础上使用注册设备(如下定义),和(4)

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

转自:http://www.gameres.com/665306.html TCG演进史 说到卡牌游戏,大家会联想到什么呢? 是历史悠久的扑克牌.风靡全球的<MTG 魔法风云会>与<游戏王>.结合数位与现实的<三国志大战>.或是在手机上掀起收集热潮的<龙族拼图>和<百万亚瑟王>? 卡牌游戏这个统称,其内容可以跟各式各样的玩法结合,而暴风雪新推出的<炉石战记>(以下简称炉石)所选择的玩法,是让玩家自行组牌.进行对战的「集换式卡牌游戏」(

分析Wargaming转向免费获胜策略的决定

这个星球上最成功的一家免费在线游戏公司宣称将改变旗下所有游戏的盈利方式. <坦克世界>的开发商Wargaming.net在独家访问时说道,他们将从当前以及即将发行的游戏上删除“付费获胜”的购买选择. World-of-Tanks(from mmoculture) 这一改变最先落实于该公司旗下最受欢迎的在线游戏<坦克世界>上,并将出现在即将问世的游戏<战绩世界>以及<战舰世界>中. 关于这一策略的介绍: 该公司于2012年开始使用“免费获胜”策略. “免费获胜

RoboCup机器人救援仿真组比赛规则

2017江苏省机器人大赛 RoboCup机器人救援仿真组比赛规则 2017年 9月 一.比赛环境 1.  软件环境 a)仿真环境:Linux 操作系统,将采用 Ubuntu12.04 64 位, Java 1.7 run-time. b)  仿真服务器:比赛采用 2016 年国际比赛稳定的服务器版本,定 为 Rescue Server package v1.2. 2.  硬件环境 a)比赛所用的 PC:每支队伍在比赛时使用 4 台 PC,其中一台用于运行 Kernel,另外 3台运行参赛队伍的客

C++的常用输入及其优化以及注意事项

$P.S:$ 对于输入方式及其优化有了解的大佬可直接阅读$Part$ $2$ 特别鸣谢:@归斋目录: $Part$ $1$                                                        读入方式们的万年争斗 $Part$ $2$                                                        读入不谨慎,爆0两行泪 $Part$ $1$ 读入方式们的万年争斗 有一些$OIer$很喜欢用$cin$,多方便