문제
https://www.acmicpc.net/problem/11070
문제해설
2팀이 주어지고 각각 득점한 수가 주어진다.
득점과 실점을 구하여 계산식에 맞게 기댓값을 구한 후
팀 중의 최대와 최소 기댓값을 구하면 된다.
문제풀이
간단해보이는 문제인데 참 많이 틀렸다.
결국 틀린 이유는 마지막 개행문자를 안넣어서 그랬다….
문제를 틀릴만한 이유를 설명해보자면
계산식을 구한 후 1000을 곱한다면 상관없지만
분자에 1000을 곱한 후 분모를 나누려면 long long자료형을 써야한다.
또한 득점과 실점이 모두 0인 경우를 처리해야한다.
전체코드
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
29
30
31
32
33
34
35
36
#include<iostream>
#include<algorithm>
#include<vector>
#include<limits.h>
using namespace std;
typedef pair<double, double>P;
int main() {
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int t; cin >> t;
while (t--) {
int n, m; cin >> n >> m;
vector<P>arr(n + 1, { 0,0 });
for (int i = 0; i < m; i++) {
int a, b, p, q; cin >> a >> b >> p >> q;
arr[a].first += p;
arr[a].second += q;
arr[b].first += q;
arr[b].second += p;
}
int maxx = 0, minn = INT_MAX;
for (int i = 1; i <= n; i++) {
double exp;
if (arr[i].first == 0 && arr[i].second == 0)
exp = 0;
else {
exp = arr[i].first * arr[i].first / (arr[i].first * arr[i].first + arr[i].second * arr[i].second);
exp = exp * 1000;
}
maxx = max(maxx, (int)exp);
minn = min(minn, (int)exp);
}
cout << maxx << "\n" << minn << "\n";
}
return 0;
}