본문 바로가기

백준/골드

[백준 17073번] 나무 위의 빗물 (C++)

문제링크 : https://www.acmicpc.net/problem/17073

 

17073번: 나무 위의 빗물

첫째 줄에 트리의 노드의 수 N과 1번 노드에 고인 물의 양을 의미하는 정수 W가 주어진다. (2 ≤ N ≤ 500,000, 1 ≤ W ≤ 109) 다음 N-1줄에 걸쳐, 트리에 존재하는 간선의 정보가 U V의 형태로 주어진다

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int N, W;
double cnt;
int arr[500001];

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);
    
    cin >> N >> W;
    for(int i=0; i<N-1; i++)
    {
        int u, v;
        cin >> u >> v;
        arr[u]++;
        arr[v]++;
    }

    for(int i=2; i<=N; i++) //1은 루트이므로 2부터
    {
        if(arr[i]==1) cnt++; //리프노드 카운트
    }

    cout.precision(11); //소수점 자리 고정
    cout << W / cnt;
    
}

 

물이 움직이지 않는 상태는 현재 노드가 리프노드인 상태를 말한다. 

그리고 Pi가 0보다 큰 정점들 또한 마찬가지로 리프노드를 말한다.

부모 노드 및 조상 노드들의 경우 자식이 존재하여 밑으로 물이 빠지기에 값이 0일 수 밖에 없다.

따라서 총 물의 양 W에 리프노드의 갯수를 나눈 것이 정답이 된다.

 

해당 문제에서 정답과의 차이가 10 ^ -3 이하인 값은 모두 정답이라고 했으므로 단순히 나누기만 하는 것이 아니라 출력할 때 소수점 자리에 신경을 써줘야한다.

위 코드에서는 예제와 똑같은 값을 출력하기 위해 소수점을 저렇게 줬지만, 오차범위 이내이기만 하면 되므로 적절히 조절해서 출력해주면 된다.

'백준 > 골드' 카테고리의 다른 글

[백준 1717번] 집합의 표현 (C++)  (0) 2023.11.07
[백준 2133번] 타일 채우기 (C++)  (0) 2023.11.06
[백준 4803번] 트리 (C++)  (0) 2023.11.02
[백준 11812번] K진 트리 (C++)  (0) 2023.10.31
[백준 11437번] LCA (C++)  (0) 2023.10.30