이거 더 간단한 방법 있었을 것 같은데 조합밖에 안 떠올라서 조합 써서 풀었다.
조합.. 코딩해야 하는데 머리 안 굴러가서 전에 짜둔거 들고왔음ㅎㅎ..
지금 보니 짤 수 있을 것 같다
이 문제ㅋㅋ 계속 틀리는데 이유를 몰랐다.
작은 문자열부터 확인해보다가 ?이 없는 문자열을 계산 안 해줬다는 거 깨닫고 조건 추가해줬다.
근데 이 다음부터는 도저히 원인을 몰랐는데 모를만 했다..
실수 출력 할 때 오차범위를 조심해야 한다.
나는 0.5 이렇게 출력하면 그 뒷 범위는 자동으로 계산해주는 줄 알았는데 아니었음.
이 때는 cout 말고 printf("%.10lf") 이렇게 소수점 10자리까지 출력하겠다고 명시해놔야 한다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
using namespace std;
using i64 = long long;
using ii = pair<int, int>;
i64 combination(int n, int k)
{
if(n == k || k == 0)
return 1;
return (combination(n-1, k-1) + combination(n-1, k));
}
int main() {
string send;
string recv;
cin >> send;
cin >> recv;
int pos = 0;
for (int i = 0; i < send.size(); i++)
{
if (send[i] == '+')
pos++;
else
pos--;
}
int r_pos = 0, q_num = 0;
for (int i = 0; i < recv.size(); i++)
{
if (recv[i] == '+')
r_pos++;
else if (recv[i] == '-')
r_pos--;
else
q_num++;
}
if (q_num == 0)
{
if (r_pos == pos)
cout << "1.0";
else
cout << "0.0";
return (0);
}
vector<i64> res;
int start = q_num;
for (int i = 0; i <= q_num; i++, start -= 2)
{
i64 comb = combination(q_num, i);
for (i64 i = 0; i < comb; i++)
{
res.push_back(start);
}
}
double d = 0;
for (int i = 0; i < res.size(); i++)
{
res[i] += r_pos;
if (pos == res[i])
d++;
}
printf("%.10lf", d/(double)res.size());
return 0;
}
'코드포스' 카테고리의 다른 글
[코드포스 Practice18] D. Mr. Kitayuta's Colorful Graph (0) | 2020.04.16 |
---|---|
[코드포스 Practice18] C. Vanya and Exams (0) | 2020.04.16 |
[코드포스 Practice18] A. Minimum Triangulation (0) | 2020.04.16 |
[코드포스 Practice18] 후기 (0) | 2020.04.16 |
[코드포스 Practice17] E. Day at the Beach (0) | 2020.04.11 |