トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.159 刺さらないUSB

■■■問題■■■

USB(コネクタ)について、「2回ひっくり返すと刺さる」と言われることがあります。
 太郎君は、USBを刺す時次のような手順に従います。
 
1.始め、USBは確率pで表向きで確率(1-p)で裏向きである。

2.USBを刺すことを試みる。
  USBが表向きの時確率qでUSBが刺さり、確率(1-q) で刺さらない。
  USBが裏向きのときUSBは刺さらない。

3.USBが刺さらなかった場合、USBが表なら裏に、裏なら表にひっくり返し、2に戻る。
  USBが刺さった場合手順を終える。

USBを刺す各試行は独立と考えてよい。

この手順においてUSBをちょうどi回ひっくり返して終わる確率をPiと表すことにします。
太郎君は、P1<P2となるのがどのような場合か気にしています。p,qが与えられるので、
P1<P2ならばYES 、そうでない時NOを出力するプログラムを作成してください。

■■■入力■■■

p q

p,qがスペース区切りの1行で与えられる。p,q はそれぞれ小数点以下第5位まで与えられる。
末尾には改行がある。

0 <= p <= 1
0.1 <= q <= 1
|P1-P2| >= 10の-5乗

■■■出力■■■

YESまたはNOを出力してください。 最後に改行してください。 


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "Input1";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("0.80000 0.50000");
            //YES
            //この場合、P1=0.1で、P2=0.2です
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("0.60000 0.50000");
            //NO
            //この場合、P1=0.2で、P2=0.15です
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        decimal[] wkArr = InputList[0].Split(' ').Select(X => decimal.Parse(X)).ToArray();
        decimal p = wkArr[0];
        decimal q = wkArr[1];

        decimal P1 = (1 - p) * q;
        decimal P2 = p * (1 - q) * q;
        Console.WriteLine(P1 < P2 ? "YES" : "NO");
    }
}


解説

確率の乗法定理を使ってます。