15997 : 승부 예측

풀이

6개 각각의 경기마다 W, D, L 3개의 상태가 있으므로

최종 스코어는 총 3^6개의 경우가 나올 수 있다.

개수가 많지 않으니 완전탐색을 해주자.

마지막에 동률인 경우를 예외처리 하는 게 몹시 화가 나지만

인내심을 가지고 풀어보자.

코드

#include <bits/stdc++.h>
#define fst first
#define snd second
using namespace std;

map<string, int> m;
struct abc {
	int x, y;
	double w, d, l;
} a[6];

int s[4];
double r[4];
pair<int, int> t[4];

void go(int n, double p) {
	if (n == 6) {
		for (int i = 0; i < 4; i++) {
			t[i].fst = s[i];
			t[i].snd = i;
		}
		sort(t, t+4);
		int A = t[0].fst, B = t[1].fst, C = t[2].fst, D = t[3].fst;
		int a = t[0].snd, b = t[1].snd, c = t[2].snd, d = t[3].snd;
		if (B != C) {
			r[c] += p; r[d] += p;
		} else if (A == B && C == D) {
			r[a] += p/2.0; r[b] += p/2.0;
			r[c] += p/2.0; r[d] += p/2.0;
		} else if (A == B) {
			r[a] += p/3.0; r[b] += p/3.0;
			r[c] += p/3.0; r[d] += p;
		} else if (C == D) {
			r[b] += p*2.0/3.0; r[c] += p*2.0/3.0;
			r[d] += p*2.0/3.0;
		} else {
			r[b] += p/2.0; r[c] += p/2.0;
			r[d] += p;
		}
		return;
	}

	int x = a[n].x, y = a[n].y;

	s[x] += 3;
	go(n+1, p*a[n].w);
	s[x] -= 3;

	s[x] += 1; s[y] += 1;
	go(n+1, p*a[n].d);
	s[x] -= 1; s[y] -= 1;

	s[y] += 3;
	go(n+1, p*a[n].l);
	s[y] -= 3;
}

int main() {
	for (int i = 0; i < 4; i++) {
		string str;
		cin >> str;
		m[str] = i;
	}

	for (int i = 0; i < 6; i++) {
		string s1, s2;
		cin >> s1 >> s2 >> a[i].w >> a[i].d >> a[i].l;
		a[i].x = m[s1];
		a[i].y = m[s2];
	}

	go(0, 1.0);

	for (int i = 0; i < 4; i++) {
		printf("%.18lf\n", r[i]);
	}

	return 0;
}

아무말

백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge, C, C++, 씨, 씨쁠쁠, JAVA, algorithm, 자바, 알고리즘, 자료구조, 문제, 문제 풀이, 풀이

wookje.kwon's profile image

wookje.kwon

2018-11-15 23:12

Read more posts by this author