桂花游戏

【 来源:牛客网 “菜鸟杯”华中师范大学程序设计新生赛(同步赛) 】

链接:https://ac.nowcoder.com/acm/contest/26134/J

(略有改动)

题目描述

华中师范大学坐落于美丽的桂子山上。每年的秋天,华师校园内都洋溢着袭人心怀,沁人肺腑的桂花芳香。

小哈和小赫都是华师智商最高的学生,小哈了解到小赫十分喜欢桂花,便想摘一些送给她,但是小哈比较内向,不敢直接表达自己的心意,他便想用一个游戏来送一些桂花给小赫。

小哈邀请小赫来参加了这个桂花游戏,小哈给小赫介绍了游戏规则:

在每轮中,他们都可以向对方展示一个数,该数可为 00 或者 11

当他们展示的数不同时,小赫会获得 XX 朵桂花

当他们展示的数都是 11 时,小哈会获得 YY 朵桂花

当他们展示的数都是 00 时,小哈会获得 ZZ 朵桂花

他们会玩这个桂花游戏 21000002^{100000} 轮,小赫十分喜欢这个游戏,她会在游戏中想办法赢下更多的桂花。为了让小赫有一个更好的游戏体验,小哈也会想办法赢下更多的桂花。请你判断一下最后谁可以获得更多的桂花呢?

输入描述

第一行为一个整数 TT,代表输入数据的组数。接下来的 TT 行每行包括三个整数 X,Y,ZX,Y,Z 三者由空格隔开。

  • T500T ≤500
  • 1X,Y,Z101≤X,Y,Z ≤10
  • Y+Z2XY+Z≤2X

输出描述

如果小哈获得的桂花更多,就输出"xiaoha",如果小赫获得的桂花更多,就输出"xiaohe",如果是平局,就输出"ping"。

样例

输入

2

4 2 1

1 1 1

输出

xiaohe

ping

题目分析

观察样例,及题面中的 X+Y2ZX+Y {\leq} 2Z 猜测 当 Y+Z=2XY+Z = 2X 时,平局。 当 Y+Z<2XY+Z < 2X 时,小赫获胜。 故伪代码为

if Y+Z=2X:
    print("ping")
else:
	print("xiaohe")

提交后发现 WA 了。

进一步观察,猜测 当 X=Y=ZX=Y=Z 时,平局。 否则,小赫获胜。 故伪代码为

if X=Y=Z:
    print("ping")
else:
	print("xiaohe")

提交,愉快 AC

但是,以上解答均只是猜测,如何严格证明呢?

证明

将小赫得到 mm 朵桂花记为 +m+m,小哈得到 mm 朵桂花记为 m-m, 则若最后桂花数为正,则小赫赢,桂花数为 00 则平局,桂花数为负则小哈赢。 设小赫出 11 的概率为 p1p_1,小哈出 11 的概率为 p2p_2,则可以列出如下表格

p1p_1 1p11-p_1
p2p_2 Y-Y +X+X
1p21-p_2 +X+X Z-Z

每次游戏桂花数的期望

E=Xp1(1p2)+Xp2(1p1)Yp1p2Z(1p1)(1p2)E=Xp_1(1-p_2)+Xp_2(1-p_1)-Yp_1p_2-Z(1-p_1)(1-p_2)

E=(2X+Y+Z)p1p2+(X+Z)p1+(X+Z)p2ZE=-(2X+Y+Z)p_1p_2+(X+Z)p_1+(X+Z)p_2-Z

若小赫获胜,则p1[0,1],p2[0,1],E>0\exists p_1\in[0,1],\forall p_2\in[0,1],E>0

计算可知ZX+Z<p1<XX+Y\frac{Z}{X+Z}<p_1<\frac{X}{X+Y}

X+Y<2ZX+Y < 2Z,则0<ZX+Z<XX+Y<10<\frac{Z}{X+Z}<\frac{X}{X+Y}<1

因此,只要小赫将出 11 的概率控制在区间 (ZX+Z,XX+Y)(\frac{Z}{X+Z},\frac{X}{X+Y}) 内,经过 21000002^{100000} 后即可获胜。

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;
}

时间复杂度为 O(T)O(T)