※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25905번 문제인 장인은 도구를 탓하지 않는다이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25905
25905번: 장인은 도구를 탓하지 않는다
BaekJoonOnline은 프로그래밍 언어를 사용하여 퀴즈를 푸는 정말정말 흥미로운 게임이다. 하지만 실력에 정체기가 온 성현이는 자신의 실력을 도구 탓으로 돌리고 노트북을 강화하기로 하였다. 주
www.acmicpc.net
사용할 9개의 강화망치를 선택했다면, 어떤 순서로 망치를 사용하더라도 강화에 성공할 확률은 일정하다는 점을 관찰하자.
따라서 10개의 망치중 9개의 망치를 고르는 총 10가지 경우의 수를 살펴 문제를 해결할 수 있다.
각 소수는 많아야 소수점 아래 두자리까지만 주어지고 소수의 곱셈은 정수형태로 바꿔 계산 후 적절한 위치에 소수점을 찍듯이 할 수 있다는 점을 이용해, 위의 확률을 계산하는 과정에서 실수 연산을 단 한 번만 사용하게끔 계산식을 정리할 수 있다. 이를 이용해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
ll p[10];
ll mx = 0, X = 1;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (ll i = 2; i < 10; i++) X *= i;
for (int i = 0; i < 10; i++) {
string s; cin >> s;
if (s[0] == '1') p[i] = 100;
else if (s.length() == 3) p[i] = (s[0] - '0') * 100 + (s[2] - '0') * 10;
else p[i] = (s[0] - '0') * 100 + (s[2] - '0') * 10 + (s[3] - '0');
}
for (int k = 0; k < 10; k++) {
ll tmp = 1;
for (int i = 0; i < 10; i++) {
if (i == k) continue;
tmp *= p[i];
}
mx = max(mx, tmp);
}
cout << fixed;
cout.precision(10);
cout << ((double)mx) / 362880000000000LL;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 27435 // C++] 파도반 수열 2 (0) | 2023.02.09 |
---|---|
[BOJ 9461 // C++] 파도반 수열 (0) | 2023.02.09 |
[BOJ 2520 // C++] 팬케이크 사랑 (0) | 2023.02.09 |
[BOJ 1092 // C++] 배 (0) | 2023.02.08 |
[BOJ 11522 // C++] Sum Kind of Problem (0) | 2023.02.07 |