C언어/C언어 문제

[C언어] 백준 11070번: 피타고라스 기댓값

renne 2022. 8. 17. 02:55

https://www.acmicpc.net/problem/11070

 

11070번: 피타고라스 기댓값

입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫 줄에는 두 양의

www.acmicpc.net

 

[문제]

W: 피타고라스 기댓값

S: 해당 팀의 총 득점 수

A: 해당 팀의 총 실점 수

*어떤 팀의 S와 A가 모두 0이면, W는 0이다.

 

[입력]

 

팀 개수: n (2 ≤ n ≤ 1,000) 전체 경기 수: m (2 ≤ m ≤ 1,000)
팀 a 팀 b 팀 a 득점: p 팀 b 득점: q
팀 1 팀 2 3 5
팀 1 팀 3 10 1
팀 1 팀 2 0 7
팀 2 팀 3 9 3
팀 3 팀 2 4 5

 

1 ≤ a ≠ b ≤ n

p와 q는 20 이하의 자연수

 

[출력]

1번째 줄: (팀별 W 중 최대 W * 1000)의 정수 부분

2번째 줄: (팀별 W 중 최소 W * 1000)의 정수 부분

 

#include <stdio.h>
long long pytha(long long s, long long a){
    if (s == 0 && a == 0) return 0;
    else return (s*s) * 1000 / (s*s + a*a);
}
int main(){
    int t;
    scanf("%d", &t);
	
    for (int k = 0; k < t; k++){
        int n, m, a, b, p, q;
        long long S[1001] = {0}, A[1001] = {0}, W[1001] = {0}, max, min;
        scanf("%d %d", &n, &m);
		
        for (int i = 0; i < m; i++){
            scanf("%d %d %d %d", &a, &b, &p, &q);
            S[a] += p; A[a] += q;
            S[b] += q; A[b] += p;
        }

        for (int i = 1; i <= n; i++){
            W[i] = pytha(S[i], A[i]);
            if (i == 1) max = min = W[i];
            else{
                if (max < W[i]) max = W[i];
                if (min > W[i]) min = W[i];
            }
        }
        printf("%lld\n%lld\n", max, min);
    }
    return 0;
}

 

long long을 사용한 이유: (s*s) * 1000

1. s는 해당 팀의 총 득점 수이다.

2. p(팀a의 득점)의 최댓값은 20이고, m(전체 경기 수)의 최댓값은 1000이다.

3. 따라서 s의 최댓값은 (20*1000)이다.

4. 따라서 ((s*s) * 1000)의 최댓값은 ((20*1000)*(20*1000))*1000 = 400,000,000,000이다.

5. int의 범위를 넘어서므로 long long을 사용한다.