상세 컨텐츠

본문 제목

9700. USB 꽂기의 미스터리 D3

알고리즘/SWExpertAcademy

by 아리따운노을 2020. 3. 25. 14:50

본문

※ SW expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

정우는 USB 커넥터를 포트에 꽂고 있다. 정확히 꽂기 까지 다음과 같은 과정을 거친다.

- 가장 처음 USB를 꽂을 때, p의 확률로 올바른 면으로 USB를꽂은 것이고 ,
    (1 - p)의 확률로는 뒤집어서 USB를 꽂은 것이다.

- 만약 올바른 면으로 USB를 꽂으면 q의 확률로 정상적으로 USB가 꽂히고,
    (1 - q)의 확률로는 꽂히지 않는다. USB가 뒤집어져 있다면 절대로 꽂히지 않는다.

- USB를 꽂는 것을 실패하면 USB를 뒤집은 다음 다시 꽂는 것을 시도한다.

 

이 때, USB를 정확히 i번 뒤집었을 때 USB가 꽂힐 확률을 si 로 나타낸다.
정우는 지금까지 USB를 두 번이나 뒤집어야 USB가 제대로 꽂히는 놀라운 경험을 너무 많이 했고, 이런 상황이 얼마나 많이 일어날 수 있는지 알고 싶다.
이를 위해 p, q가 주어지면 s1< s2인지 아닌지 판별하는 프로그램을 작성하라.

 

 

[입력]

첫 번째 줄에 테스트 케이스의 수 TC가 주어진다.
이후 TC개의 테스트 케이스마다 두 실수 p와 q가(0 ≤ p ≤ 1 , 0 ≤ q ≤ 1) 공백으로 구분되어 주어진다.
주어진 입력은 |s1 - s2| ≥ 10-5 인 것이 보장된다.

 

[출력]

각 테스트 케이스마다 ‘#t ’( t 는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,
s1< s2 이면 “YES”를 아니면 “NO”를 출력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
using namespace std;
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n;
    double p,q;
    cin>>n;
    for(int t=1;t<=n;t++)
    {
        double s1 = 0, s2 = 0;
        cin>>p>>q;
        s1 = (1-p)*q; //1
        s2 = p*(1-q)*q; //2
        if(s1<s2)
            cout<<'#'<<t<<" YES\n";
        else
            cout<<'#'<<t<<" NO\n";
    }
 
 
    return 0;
}
 
cs

1번 뒤집었을때 맞을 확률

 = 처음에 잘못 꽂았을 확률(1-p) *  뒤집어서 제대로 꽂아질 확률 q => (1-p)*q

2번 뒤집었을때 맞을 확률

= 처음에 방향이 맞았지만 제대로 못 꽂을 확률 p*(1-q) * 2번 뒤집어서 꽂아질 확률 q => p*(1-q)*q

둘이 비교해서 출력

처음 뒤집었을 때는 안맞으므로 별다른 곱셉을 하지 않고 넘어감

관련글 더보기

댓글 영역