桂花游戏
【 来源:牛客网 “菜鸟杯”华中师范大学程序设计新生赛(同步赛) 】
链接:https://ac.nowcoder.com/acm/contest/26134/J
(略有改动)
题目描述
华中师范大学坐落于美丽的桂子山上。每年的秋天,华师校园内都洋溢着袭人心怀,沁人肺腑的桂花芳香。
小哈和小赫都是华师智商最高的学生,小哈了解到小赫十分喜欢桂花,便想摘一些送给她,但是小哈比较内向,不敢直接表达自己的心意,他便想用一个游戏来送一些桂花给小赫。
小哈邀请小赫来参加了这个桂花游戏,小哈给小赫介绍了游戏规则:
在每轮中,他们都可以向对方展示一个数,该数可为 或者
当他们展示的数不同时,小赫会获得 朵桂花
当他们展示的数都是 时,小哈会获得 朵桂花
当他们展示的数都是 时,小哈会获得 朵桂花
他们会玩这个桂花游戏 轮,小赫十分喜欢这个游戏,她会在游戏中想办法赢下更多的桂花。为了让小赫有一个更好的游戏体验,小哈也会想办法赢下更多的桂花。请你判断一下最后谁可以获得更多的桂花呢?
输入描述
第一行为一个整数 ,代表输入数据的组数。接下来的 行每行包括三个整数 三者由空格隔开。
输出描述
如果小哈获得的桂花更多,就输出"xiaoha",如果小赫获得的桂花更多,就输出"xiaohe",如果是平局,就输出"ping"。
样例
输入
2
4 2 1
1 1 1
输出
xiaohe
ping
题目分析
观察样例,及题面中的 猜测 当 时,平局。 当 时,小赫获胜。 故伪代码为
if Y+Z=2X:
print("ping")
else:
print("xiaohe")
提交后发现 WA 了。
进一步观察,猜测 当 时,平局。 否则,小赫获胜。 故伪代码为
if X=Y=Z:
print("ping")
else:
print("xiaohe")
提交,愉快 AC 。
但是,以上解答均只是猜测,如何严格证明呢?
证明
将小赫得到 朵桂花记为 ,小哈得到 朵桂花记为 , 则若最后桂花数为正,则小赫赢,桂花数为 则平局,桂花数为负则小哈赢。 设小赫出 的概率为 ,小哈出 的概率为 ,则可以列出如下表格
每次游戏桂花数的期望
即
若小赫获胜,则
计算可知
若,则
因此,只要小赫将出 的概率控制在区间 内,经过 后即可获胜。
AC代码(C++)
#include<iostream>
using namespace std;
int T,X,Y,Z;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&X,&Y,&Z);
if(X==Y&&Y==Z)puts("ping");
else puts("xiaohe");
}
return 0;
}
时间复杂度为