题目描述

小 Q 最近发现了一款新游戏,游戏的目标是从一个新手修炼成为武功高强的大侠。面对错综复杂的游戏世界,小 Q 要对他面临的每件事情做出谨慎的选择。例如,是否参加一个陌生人邀请的比武;同意或是拒绝用宝剑交换他人的武功秘籍......而小 Q 做出的每一个选择都有可能影响到他以后的发展:面对一个高手,若主动与之比武,很可能会损失惨重;但若不去比武,也许今后就再也见不到这个高手了。

对着这个游戏,小 Q 玩了很多次仍然玩不出他想要的结局,于是他费尽千辛万苦找到了游戏的剧本。令人惊讶的是,游戏的剧本并不像我们平时见到的剧本,反而很像代码。这个剧本是这样描述的:

  • 量:有 22 种量,常数和变量。
  • 常数:一个整数。
  • 变量:初始值为 00 的可变整数,不同变量用不同正整数编号区分。
  • 事件:整个剧本由若干个事件构成。所有的事件按照给定的顺序从 11 开始依次编号。事件共有 33 种:普通事件、选择跳转和条件跳转。
  • 执行位置:一个整数,表示接下来将会执行的事件编号,如果不存在这个编号的事件则停止,即游戏到了一个结局。最初的时候执行位置为 11。
  • 普通事件:一个变量增加或减少一个量的值。之后执行位置增加 11。
  • 选择跳转:两个整数。执行到这里时玩家需要在这两个整数中选择一个,之后执行位置将被修改为这个整数。
  • 条件跳转:两个量和两个整数。执行到这里时,若第一个量小于第二个量,则执行位置将被修改为第一个整数,否则将被修改为第二个整数。

小 Q 认为,整个游戏是希望一个叫做「成就值」的变量(编号为 11)最大。

输入格式

该题为提交答案型试题,所有输入数据 train1.in~train10.in 已在附加文件中。

输入的第一行包含两个正整数 n, mn,m,表示事件的个数和变量的个数。

接下来有 nn 行,每行描述一个事件。这些事件按照给出的顺序依次编号为 11 到 nn。

描述量和事件的格式如下(格式中 #表示空格)

输出格式

针对给定的 1010 个输入文件 train1.in~train10.in,你需要分别提交你的输出文件 train1.out~train10.out

每个文件需要输出若干行,每行输出一个字符 1 或 2,表示执行过程中遇到的每个选择跳转所作的选择。输出的行数需要严格等于此次游戏执行过程中遇到的选择跳转的个数。

输入输出样例

输入 #1复制

11 2
v 2 + c 19
i v 2 c 3 7 3
s 4 7
v 1 + c 13
v 2 - c 3
i c 0 c 1 2 0
i v 2 c 5 12 8
s 9 12
v 1 + c 23
v 2 - c 5
i c 0 c 1 7 0

输出 #1复制

1
1
1
2
1
1

说明/提示

评分标准

对于每组数据,我们采用如下方式评分:

  • 如果你的输出不合法,得 00 分。
  • 如果你的输出执行了超过 10^6106 行剧本,得 00 分。
  • 如果你的输出能让剧本正常结束,得 11 分。
  • 如果你的输出能让剧本正常结束,且结束时成就值为正数,得 22 分。

我们设置了 88 个评分参数 a_3 , a_4 , \ldots , a_{10}a3​,a4​,…,a10​。

如果你的输出能让剧本正常结束,且结束时成就值不小于 a_sas​,得 ss 分。

如果以上条目有多项满足,则取满足条件中的最高得分。

如何测试你的输出

我们提供 checker 这个工具来测试你的输出文件是否是可接受的。使用这个工具的方法是,首先进入终端,在终端中运行下面的命令进入本题的文件夹:

cd train

然后运行:

./checker <case_no>

其中 case_no 是测试数据的编号。例如

./checker 3

将测试 train3.out 是否可以接受。

在你调用这个程序后,checker 将根据你给出的输出文件给出测试的结果,其中包括:

  • 非法退出:未知错误。
  • Input/Output file does not exist.:输入/输出文件不存在。
  • Output invalid.:输出文件有误,此时可能包含具体错误信息。
  • Correct! Your answer is x.:输出可接受,最后的成就值为 xx。

更多功能

checker 还可以检查任意输入输出文件的测试结果,方法是在终端中运行:

cd train

./checker <input_file_name> <output_file_name>

其中 input_file_name 和 output_file_name 分别是输入输出文件的名称。例如

./checker train3.in train3.out

将测试 train3.out 是否可以接受。

使用 -w 可以输出每步运行的结果。用法是

./checker -w <input_file_name> <output_file_name>

或者

./checker -w <case_no>

例如

./checker -w train3.in train3.out

特别提示

如果选手使用自己生成输入文件进行调试,有可能因规模过大造成 checker 出错。若发生这类情况,请尝试较小规模的数据。

这是不太正确的代码

题目背景

spj来源:loj-Robin。已获得授权。

https://www.luogu.org/paste/dxytr6gc

附spj,一些修改部分未按照代码规范,请各位谅解。

题目描述

魔法国度 Magic Land 里最近出现了一个大盗 Frank,他在 Magic Land 四处作案,专门窃取政府机关的机密文件(因而有人怀疑 Frank 是敌国派来的间谍)。

为了捉住 Frank,Magic Land 的安全局重拳出击!

Magic Land 由 N 个城市组成,并且这 N 个城市又由恰好 N-1 条公路彼此连接起来,使得任意两个城市间都可以通过若干条公路互达。从数据结构的角度我们也可以说,这 N 个城市和 N-1 条公路形成了一棵树。

例如,下图就是 Magic Land 的一个可能格局(4 个城市用数字编号,3 条公路用字母编号):

大盗 Frank 能够在公路上以任意速度移动。

比方说,对于上图给出的格局,在 0.00001 秒钟内(或者任意短的一段时间内),Frank 就可以从城市 1 经过城市 2 到达城市 4,中间经过了两条公路。

想要生擒 Frank 困难重重,所以安全局派出了经验丰富的警探,这些警探具有非凡的追捕才能:

  1. 只要有警探和 Frank 同处一个城市,那么就能够立刻察觉到Frank,并且将其逮捕。

  2. 虽然 Frank 可以在公路上以任意快的速度移动,但是如果有警探和 Frank 在同一条公路上相遇,那么警探也可以立刻察觉到 Frank 并将其逮捕。

安全局完全不知道 Frank 躲在哪个城市,或者正在哪条公路上移动,所以需要制定一个周密的抓捕计划,计划由若干 步骤组成。在每一步中,可以做如下几件事中的一个:

  1. 在某个城市空降一位警探。警探可以直接从指挥部空降到 Magic Land 的任意一个城市里。此操作记为“L x”,表示在编号为 x 的城市里空降一位警探。耗时 1 秒。

  2. 把留在某个城市里的一位警探直接召回指挥部。以备在以后的步骤中再度空降到某个城市里。此操作记为“B x”。表示把编号为 x 的城市里的一位警探召回指挥部。耗时 1 秒。

  3. 让待在城市 x 的一位警探沿着公路移动到城市 y,此操作记为“M x y”。耗时 1 秒。当然,前提是城市 x 和城市 y 之间有公路。如果在警探移动的过程中,大盗 Frank 也在同一条公路上,那么警探就抓捕到了Frank。

现在,由你来制定一套追捕计划,也就是给出若干个步骤,需要保证:无论大盗 Frank 一开始躲在哪儿,也无论 Frank 在整个过程中如何狡猾地移动(Frank大盗可能会窃取到追捕行动的计划书,所以他一定会想尽办法逃避),他一定会被缉拿归案。

希望参与的警探越少越好,因为经验丰富的警探毕竟不多。

例如对于前面所给的那个图示格局,一个可行的计划如下:

  1. L 2 在城市 2 空降一位警探。注意这一步完成之后,城市 2 里不会有 Frank,否则他将被捉住。

  2. L 2 再在城市 2 空降一位警探。

  3. M 2 1 让城市 2 的一位警探移动到城市 1。注意城市 2 里还留有另一位警探。这一步完成之后,城市 1 里不会有 Frank,公路 A 上也不会有 Frank。也就是说,假如 Frank 还没有被逮捕,那么他只能是在城市 3 或城市 4 里,或者公路 B 或公路 C 上。

  4. B 1 召回城市 1 的一位警探。注意虽然召回了这位警探,但是由于我们始终留了一位警探在城市 2 把守,所以 Frank 仍然不可能跑到城市 1 或者是公路 A 上。

  5. L 3 在城市 3 空降一位警探。注意这一步可以空降在此之前被召回的那位警探。这一步完成之后,城市 3 里不会有 Frank,否则他会被捉住。

  6. M 3 2 让城市 3 里的一位警探移动到城市 2。这一步完成之后,如果 Frank 还没有被捉住,那他只能是在公路 C 上或者城市 4 里。注意这一步之后,城市 2 里有两位警探。

  7. M 2 4 让城市 2 里的一位警探移动到城市 4。这一步完成之后,Frank 一定会被捉住,除非他根本就没来 Magic Land。

这个计划总共需要 2 位警探的参与。可以证明:如果自始至终只有 1 名或者更少的警探参与,则 Frank 就会逍遥法外。

你的任务很简单:对于一个输入的 Magic Land 的格局,计算 S,也就是为了追捕 Frank 至少需要投入多少位警探,并且给出相应的追捕计划步骤。

输入格式

输入文件给出了 Magic Land 的格局。

第一行一个整数 N,代表有 N 个城市,城市的编号是 1~N。

接下来 N-1 行,每行有两个用空格分开的整数 x i ,y i ,代表城市 x i ,y i之间有公路相连。保证 1≤x i ,y i ≤N

输出格式

向输出文件输出你所给出的追捕计划。

第一行请输出一个整数 S,代表追捕计划需要多少位警探。

第二行请输出一个整数 T,代表追捕计划总共有多少步。

接下来请输出 T 行,依次描述了追捕计划的每一步。每行必须是以下三种形式之一:

”L x”,其中 L 是大写字母,接着是一个空格,再接着是整数 x,代表在城市 x 空降一位警探。你必须保证 1≤x≤N。

“B x”,其中 B 是大写字母,接着是一个空格,再接着是整数 x,代表召回城市 x 的一位警探。你必须保证 1≤x≤N,且你的计划执行到这一步之前,城市 x 里面确实至少有一位警探。

“M x y”,其中 M 是大写字母,接着是一个空格,再接着是整数 x,再跟一个空格,最后一个是整数 y。代表让城市 x 的一位警探沿着公路移动到城市 y。你必须保证 1≤x, y≤N,且你的计划执行到这一步之前,城市 x 里面确实至少有一位警探,且城市 x, y 之前确实有公路。

必须保证输出的 S 确实等于追捕计划中所需要的警探数目。

输入输出样例

输入 #1复制

4
1 2
3 2
2 4

输出 #1复制

2
7
L 2
L 2
M 2 1
B 1
L 3
M 3 2
M 2 4

说明/提示

对于任何一个测试点:

如果输出的追捕计划不合法,或者整个追捕计划的步骤数 T 超过了 20000,或者追捕计划结束之后,不能保证捉住 Frank,则不能得分。

否则,用你输出的 S 和我们已知的标准答案 S * 相比较:
1. 若 S<S * ,则得到 120%的分。
2. 若 S=S * ,则得到 100%的分。
3. 若 S * <S≤S * +2,则得到 60%的分。
4. 若 S * +2<S≤S * +4,则得到 40%的分。
5. 若 S * +4<S≤S * +8,则得到 20%的分。
6. 若 S>S * +8,则得到 10%的分。

输入保证描述了一棵连通的 N 结点树,1≤N≤1 000。

这是差点满分的代码(至于我为什么不用“代码段”那是有原因的)

#include<bits/stdc++.h>

#define ll long long
#define INF 2147483647

inline int inp(){
    char c = getchar();
    while(c < '0' || c > '9')
        c = getchar();
    int sum = 0;
    while(c >= '0' && c <= '9'){
        sum = sum * 10 + c - '0';
        c = getchar();
    }
    return sum;
}

int head[100010];
int nxt[20010];
int end[20010];
char type[100000];
int num1[100000], num2[100000];
int cnt = 0;
int cou = 0;
int f[20010];

void link(int a, int b){
    nxt[++cou] = head[a];
    head[a] = cou;
    end[cou] = b;
}

void dfs(int cur, int last){
    int max = 0;
    bool mt = true;
    for(int x = head[cur]; x != -1; x = nxt[x]){
        if(end[x] != last){
            dfs(end[x], cur);
            if(f[end[x]] > max){
                max = f[end[x]];
                mt = false;
            } else if(f[end[x]] == max)
                mt = true;
        }
    }
    if(mt)
        f[cur] = max + 1;
    else
        f[cur] = max;
}

void dfs2(int cur, int last){
    int max = 0;
    bool mt = true;
    int degree = 0;
    int pos;
    for(int x = head[cur]; x != -1; x = nxt[x]){
        if(end[x] != last){
            dfs(end[x], cur);
            if(f[end[x]] > max){
                max = f[end[x]];
                mt = false;
                pos = end[x];
            } else if(f[end[x]] == max)
                mt = true;
            degree++;
        }
    }
    // printf("%d %d pos = %d\n", cur, last, pos);
    if(degree == 0){
        type[++cnt] = 'B';
        num1[cnt] = cur;
        return ;
    }
    for(int x = head[cur]; x != -1; x = nxt[x]){
        if(end[x] != pos && end[x] != last){
            type[++cnt] = 'L';
            num1[cnt] = cur;
            type[++cnt] = 'M';
            num1[cnt] = cur;
            num2[cnt] = end[x];
            dfs2(end[x], cur);
        }
    }
    type[++cnt] = 'M';
    num1[cnt] = cur;
    num2[cnt] = pos;
    dfs2(pos, cur);
    if(mt)
        f[cur] = max + 1;
    else
        f[cur] = max;
}

int main(){
    memset(head, -1, sizeof(head));
    int n = inp();
    for(int i = 1; i < n; i++){
        int u = inp();
        int v = inp();
        link(u, v);
        link(v, u);
    }
    int root = 0;
    int min = INF;
    for(int i = 1; i <= n; i++){
        dfs(i, 0);
        if(f[i] < min){
            min = f[i];
            root = i;
        }
    }
    dfs2(root, 0);
    printf("%d\n%d\n", min, cnt + 1);
    printf("L %d\n", root);
    for(int i = 1; i <= cnt; i++){
        putchar(type[i]);
        printf(" %d", num1[i]);
        if(type[i] == 'M')
            printf(" %d", num2[i]);
        putchar('\n');
    }
}

P2892 [NOI2007] 追捕盗贼相关推荐

  1. 【NOI2007】 追捕盗贼

    题目描述 追捕盗贼 问题描述 魔法国度 Magic Land 里最近出现了一个大盗 Frank,他在 Magic Land 四处作 案,专门窃取政府机关的机密文件(因而有人怀疑 Frank 是敌国派来 ...

  2. 『追捕盗贼 Tarjan算法』

    追捕盗贼(COCI2007) Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从 ...

  3. 【基于贪心的树型动态规划】【NOI2007】追捕盗贼

    问题描述 魔法国度 Magic Land 里最近出现了一个大盗 Frank,他在 Magic Land 四处作案,专门窃取政府机关的机密文件(因而有人怀疑 Frank 是敌国派来的间谍). 为了捉住 ...

  4. NOI2007.Day2.T3.追捕盗贼

    这道题是看的郑暾大牛的论文<平衡思想> 里面说这道题是树的Search Number问题,有O(n)解法,恰好我这里有数据&标程,一看标程8.5k-- 郑暾大牛给出了一种DP构造解 ...

  5. JZOJ1418. 【COCI2007】追捕盗贼

    题目描述 Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从一个城市逃亡另一个城 ...

  6. 【COCI 2007】追捕盗贼

    题目大意 给出一幅nn个点mm条边的无自环重边的无向图,要求回答QQ个问题,分为以下两种. 若删除AA和BB之间的边,问xx和yy两点之间是否联通. 若删除点AA,问xx和yy两点之间是否联通. n& ...

  7. 1491: [NOI2007]社交网络

    1491: [NOI2007]社交网络 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 881  Solved: 518 [Submit][Status ...

  8. bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash

    http://www.lydsy.com/JudgeOnline/problem.php?id=1492 dp[i] 表示 第i天卖完的最大收益 朴素的dp: 枚举从哪一天买来的在第i天卖掉,或者是不 ...

  9. 对付网络盗贼的三板斧

    太多网民.游戏玩家遇到过QQ号.网游帐号,甚至网上银行帐号被盗.网上窃贼已经从早期的单兵作战,发展到盗号销赃一条龙.针对网络盗窃,一方面存在调查取证难,二是有关立法司法严重滞后,使得网络盗窃的风险远比 ...

最新文章

  1. 正面反击 Google、FB 等巨头,万维网之父携 Solid 归来
  2. 更改Webshpere的profile端口及删除profile
  3. ◆[转]瓶子生日密码之2月2日
  4. PPT 2016 后台播放功能
  5. 考验程序员的一个FLASH游戏(Light-Bot)
  6. linux关闭mysql日志记录_linux 下mysql 运行一段时间后自动关闭,日志无异常
  7. 优秀的WMS仓库管理系统应该具备哪些条件
  8. JDK1.8中HashMap如何应对hash冲突?
  9. IPC$局域网入侵详解
  10. 学完了Scratch,我要开始学Python了~~~
  11. Playwright之初体验
  12. matlab用()括住字符串,在matlab中( )用于括住字符串.
  13. PPT造电池,特斯拉电池日画一张“十年保质期”的大饼
  14. 财务管理计算机实验日志5天,关于财务管理的实习日记范文
  15. PHP_微信公众号开发(1)
  16. oracle 48101 block,oracle数据库的一次异常起停处理。
  17. AMD5600G LOL卡顿
  18. 国密SM9算法C++实现之八:密钥交换算法
  19. 蓝牙广播“嗅探”模式应用
  20. 并行程序实现语音实时播报“检测人脸”

热门文章

  1. blender Eevee渲染器
  2. 算法学习资料推荐《啊哈!算法》下载
  3. 20189312任方园 网络攻防第二次作业
  4. (转)大数据面试题130道及答案整理 1-15
  5. ffmpeg subtitles这个垃圾玩意好坑啊
  6. Day 25 - HBuilder X 产生 apk
  7. oracle hit ratio
  8. 对啊网初级会计3资产-1应收及预付款项
  9. 《安全通论》作业1:红客与黑客单挑对抗极限——进一步分析【草稿】
  10. mysql如何根据搜索结果去重_mysql去重数据