トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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");
}
}
解説
確率の乗法定理を使ってます。