CF48E Ivan the Fool VS Gorynych the Dragon

题目描述

很久很久以前,在一个遥远的王国……好了,让我们从伊万傻瓜遇到恶龙戈里内奇开始说起。伊万拔出他的魔法宝剑,战斗开始了。一开始戈里内奇有 $h$ 个头和 $t$ 条尾巴。每一次挥剑,伊万可以砍掉若干个头(从 $1$ 到 $n$,但不得多于恶龙当前拥有的头数),或者砍掉若干条尾巴(从 $1$ 到 $m$,但不得多于恶龙当前拥有的尾巴数)。与此同时,虽然很可怕,但恶龙戈里内奇也可以长出新的头和尾巴。新长出来的头和尾巴的数量,由这次砍掉的头或尾的数量唯一决定。 当头和尾巴的总数超过 $R$ 时,恶龙戈里内奇将进行最后一击,并消灭伊万。这也是伊万希望能尽快砍掉所有恶龙的头和尾,从而取得胜利的原因。但事情也可能出现第三种发展:双方都不能战胜对方,战斗将永无休止地持续下去。 故事是这样讲的,说起来简单做起来难。你的任务是写一个程序,判断战斗的结果。注意伊万每次都连续出击。每一次出击后,恶龙会依照砍掉的头或尾巴的数量长出新的头和尾巴。如果在一次出击后,恶龙失去了所有头和尾,且无法再长出来,则伊万获胜。如果不能击败恶龙,但可以无限制地和恶龙僵持下去,那伊万就会选择这种策略;如果在任何情况下恶龙都能赢,伊万则会尽可能抵抗得最久。 伊万总会采取最优策略(傻瓜总是幸运的),即: - 如果伊万能获胜,他会以最少的出击次数获胜; - 如果无法击败恶龙,但可以与其无限僵持下去,那伊万会选择这种策略; - 如果恶龙必胜,伊万能做的就是拖延战斗的时间。

输入格式

第一行包含三个整数 $h$、$t$ 和 $R$($0 \leq h, t, R \leq 200$,$0 < h + t \leq R$),表示戈里内奇初始的头数、尾数,以及戈里内奇还未发动致命一击时头和尾总数的上限。 接下来一行包含一个整数 $n$($1 \leq n \leq 200$)。 接下来 $n$ 行,每行包含两个非负整数 $h_{i}\ t_{i}$,表示当本次砍掉 $i$ 个头时,戈里内奇会相应长出 $h_i$ 个头和 $t_i$ 条尾。 接下来一行包含一个整数 $m$($1 \leq m \leq 200$)。 接下来 $m$ 行,每行包含两个非负整数 $h'_{i}\ t'_{i}$,表示当本次砍掉 $i$ 条尾时,戈里内奇会相应长出 $h'_i$ 个头和 $t'_i$ 条尾。 所有输入数据均不超过 $200$。

输出格式

若伊万能获胜,则第一行输出 "Ivan";若恶龙获胜,则第一行输出 "Zmey";若战斗将无限持续下去,则第一行输出 "Draw"。 第二行输出伊万出击的次数。

说明/提示

由 ChatGPT 5 翻译