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을 사용한다.