牛客练习赛31 B 赞迪卡之声妮莎与奥札奇
https://ac.nowcoder.com/acm/contest/218/B
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
「生命在各处成长。我的族人只是在寻找成长最旺的地方。」 ——妮沙瑞文
奥札奇军团降临!赞迪卡陷入危机!无尽轮回钨拉莫和真理屠夫寇基雷带领着这群庞大的掠食者在赞迪卡肆意破坏。旅法师妮莎瑞文必须要阻止这一切。
在赞迪卡时空的一角,有 n 个寇族的部落。为了抵御奥札奇的进攻,这些部落之间联系密切。在任意两个部落之间都有一条直接道路相连接。换句话说,这 n 个部落与若干条道路构成了一张完全图。
现在,奥札奇军团已经占领了 1 号寇族部落并停留在此处。而钨拉莫与寇基雷两王却开始了游戏(伊莫库大姐快来管管)。游戏的规则是这样的:钨拉莫与寇基雷两王轮流带领奥札奇军团移动一次。每次可以从一个寇族部落通过一条未被腐蚀的道路移动到另一个寇族部落。任何移动必须在这 n 个寇族部落及其道路中进行。由于奥札奇对法术力的吞噬,奥札奇军团行经的道路都会被腐蚀。最后,在规则的限制下,奥札奇军团将无路可走。此时,将带领军团进行下一步移动的奥札奇之王将输掉这个游戏。钨拉莫先手。
钨拉莫与寇基雷作为奥札奇三祖中的两者,自然拥有超高的智力。所以你可以认为,他们都将以最优决策进行游戏。
游戏的赢家将率领军队与妮莎作战,而妮莎还在赶来的路上。所以请你先观察这个游戏,到时便可以告诉妮莎谁会是她的对手。
输入描述:
本题有多组测试数据。
第一行一个正整数 T ,表示数据组数。
接下去 T 行,每行一个数 n ,表示寇族部落的个数。
输出描述:
输出共 T 行,每行一个字符串 "Ulamog, the Infinite Gyre" 或 "Kozilek, Butcher of Truth" 表示胜利者(去掉括号)。前者为无尽轮回钨拉莫,后者为真理屠夫寇基雷。
示例1
输入
2
1
3
输出
Kozilek, Butcher of Truth
Ulamog, the Infinite Gyre
说明
- 当 n=3 时,钨拉莫可以率领军团从 1 走到 2 ,之后 的边不能再走了。
- 下一步寇基雷只能带领军团移动至 3 ,之后 的边不能再走了。
- 最后钨拉莫只要将军团移回 1 ,寇基雷就无路可走了。
备注:
1 ≤ T ≤ 2000
1 ≤ n ≤ 2000
分析
首先看完题第一感觉,蜜汁题目,然后反应过来是博弈,从n=1开始算,123分别是KUU胜利,从4开始,在这里引入四面体来等效点,比如
从1到2的箭头用来表示此条边
然后此时轮到k走,可以发现k从2走到3和k从2走到4是一样的,所以假设k从2走到3,由于u是绝对聪明的,所以u的两个选择3->1和3->4,在做题的时候应该是分析两种情况,在这里只分析3->1,也就是必胜的情况,
当u从3->1时,k只有一种选择也就是1->4,在之后u就可以走4->2,让k无路可走,因为在这个过程中,k要么只有一种选择要么就走几个点都是等价的,所以u采取最佳策略的时候,k是没有机会胜利的,这也就是博弈的想法,当两个人都绝对聪明,全部采取最佳策略,最后的胜利者会是谁,分析此过程。
所以整个题目在n较大的时候同理只需要把k逼入一个死角里就可以了,而这个是很简单u可以实现的策略,所以只有当n=1时k胜利,其余时候都是u胜利。
AC代码:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <string>
#include <time.h>
#include <queue>
#include <string.h>
#define sf scanf
#define pf printf
#define lf double
#define ll long long
#define p123 printf("123\n");
#define pn printf("\n");
#define pk printf(" ");
#define p(n) printf("%d",n);
#define pln(n) printf("%d\n",n);
#define s(n) scanf("%d",&n);
#define ss(n) scanf("%s",n);
#define ps(n) printf("%s",n);
#define sld(n) scanf("%lld",&n);
#define pld(n) printf("%lld",n);
#define slf(n) scanf("%lf",&n);
#define plf(n) printf("%lf",n);
#define sc(n) scanf("%c",&n);
#define pc(n) printf("%c",n);
#define gc getchar();
#define re(n,a) memset(n,a,sizeof(n));
#define len(a) strlen(a)
#define LL long long
#define eps 1e-6
using namespace std;
int main(){
int T = ;
s(T);
int n = ;
while(T --){
s(n);
if(n == ){
puts("Kozilek, Butcher of Truth");
}else{
puts("Ulamog, the Infinite Gyre");
}
}
}
感想:
这道题目主要考察逻辑思维能力,在我自己做的过程中也曾想过是否与完全图的边数的奇偶有关,然后算到n=4的时候意识到无法形成一个一笔画图的时候否定了这个猜想,又想到了七桥问题,每个点的奇偶性影响是否可以’一笔画,在n=5的时候我算错算是k胜利,所以走了一些弯路,总而言之还是一道好题。