반응형
문제 출처 :
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV18Sx36IwACFAZN
알고리즘 분석 :
문제 해결에 필요한 사항
1. 수학
A제품중 n개가 완제품일 확률 :: 18Cn * (a확률 * ... * a확률)(n개) * (1-a확률 * ... * 1-a확률)(18-n)개
정답은 결국 a 또는 b의 제품이 소수이면서 완제품일 확률이니 여사건을 이용하여
1 - (a가 소수 완제품일 확률의 여집합 * b가 소수 완제품일 확률의 여집합)을 계산한다.
소스 코드 :
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <iostream> #define MIN(a,b)(a < b ? a : b) int comb[20][20]; void makeComb(int n, int r) { comb[0][0] = 1; for (int i = 1; i <= n; i++) { int len = MIN(i, r); for (int j = 0; j <= len; j++) // 5C2는 있지만 2C5는 없다. comb[i][j] = comb[i - 1][j - 1] + comb[i - 1][j]; } } int sosu[7] = { 2,3,5,7,11,13,17 }; double percentA[20], percentB[20]; int main() { freopen("input.txt", "r", stdin); makeComb(18, 18); int tCase; scanf("%d", &tCase); for (int tc = 1; tc <= tCase; tc++) { percentA[0] = percentB[0] = 1.0; for (int i = 1; i < 20; i++) percentA[i] = percentB[i] = 0.0; int a, b; scanf("%d %d", &a, &b); double valA = 0.0, valB = 0.0; for (int i = 1; i <= 18; i++) { percentA[i] = 1.0 * comb[18][i]; for (int j = 1; j <= i; j++) percentA[i] *= (1.0 * a / 100); for (int j = 0; j < 18 - i; j++) percentA[i] *= (1.0 - (1.0 * a / 100)); } for (int i = 1; i <= 18; i++) { percentB[i] = 1.0 * comb[18][i]; for (int j = 1; j <= i; j++) percentB[i] *= (1.0 * b / 100); for (int j = 0; j < 18 - i; j++) percentB[i] *= (1.0 - (1.0 * b / 100)); } double sosuA = 0.0; for (int i = 0; i < 7; i++) sosuA += percentA[sosu[i]]; double sosuB = 0.0; for (int i = 0; i < 7; i++) sosuB += percentB[sosu[i]]; printf("#%d %.6lf\n", tc, sosuA + sosuB - (sosuA)*(sosuB)); } return 0; } | cs |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1351번] 무한 수열 (0) | 2019.07.14 |
---|---|
[1808번] 지희의 고장난 계산기 (0) | 2019.07.06 |
[1269번] 대칭 차집합 (0) | 2019.07.02 |
[3124번] 최소 스패닝 트리 (0) | 2019.07.01 |
[1247번] 최적 경로 (0) | 2019.06.27 |