BOJ 18600, Ptz Camp Summer 2019 Day 3, Valentine's Day
- λμ΄λ : Platinum 1
- μΆμ² : Petrozavodsk Summer 2019 Day 3 C
νμ΄
$n$κ°μ νλ₯ μ΄ μ£Όμ΄μ§κ³ , μ΄λ€μ λͺ¨λ λν΄μ 1μ΄λΌκ³ ν λ, μ λΉν subsetμ 골λΌμ μ¬κ±΄μ΄ λ¨ ν λ²λ§ μΌμ΄λ νλ₯ μ μ΅λννλ λ¬Έμ μ΄λ€.
μ¬κ±΄μ΄ ν λ² μΌμ΄λ νλ₯ μ λ€μκ³Ό κ°μ΄ κ³μ°ν μ μλ€. $S$λΌλ subsetμ 골λμ λ, \(\sum_{p \in S} p \prod_{q \in S, q \neq p} (1 - q)\) κ·Έλ°λ°, $\prod_{q \in S, q \neq p} (1 - q)$ λ κ²°κ΅ $\frac{1}{1-p}\prod_{q \in S} (1-q)$ μ΄λ―λ‘, ꡬνλ μμ \(\sum_{p \in S} \frac{p}{1-p} \prod_{q \in S} (1 - q)\) μ΄μ , $\prod_{q \in S} (1 - q) = m_S$ λΌ νλ©΄ \(m_S \sum_{p \in S} \frac{p}{1-p}\) λ₯Ό ꡬνλ λ¬Έμ μμ μ μ μλ€. μ΄ $m_S$λ₯Ό βκ³± λΆλΆβ, λ€ $\sum$ μ βν© λΆλΆβ μ΄λΌκ³ λΆλ₯΄μ.
μ΄λ κ² κ΅¬ν΄μ§ μ΄λ€ μ§ν© $S$μ, μλ‘μ΄ νλ₯ $pβ$μ λΆμ΄λ κ²μ΄ μ΄λμΈμ§ μν΄μΈμ§λ₯Ό λ¨Όμ λ°μ Έ 보μ. μ§κΈκΉμ§μ νλ₯ μ $p_S$ λΌ νκ³ , $p_S$μ ν© λΆλΆμ $t_S$, κ³± λΆλΆμ $m_S$λΌ νλ©΄ $p_S = t_S m_S$μ΄λ€. μ¬κΈ°μ μλ‘μ΄ νλ₯ μ κ³μ°νλ κ²μ μ΄λ ΅μ§ μμλ°, ν© λΆλΆμ΄ μ¦κ°νκ³ , κ³± λΆλΆμ $(1-pβ)$ λ₯Ό κ³±νλ κ²μ΄λ―λ‘ \(p_{new} = (1-p')m_S \left(t_S + \frac{p'}{1-p'} \right)\) μ΄μ , $p_{new} - p_S$ λ₯Ό κ³μ°νλ©΄, \(p_{new} - p_S = p' m_S - p' m_S t_S\) λ°λΌμ, μ΄ κ°μ΄ μμμ΄κΈ° μν΄μλ, $t_S$κ° 1λ³΄λ€ ν°μ§ μλμ§κ° μ€μν¨μ μ μ μλ€. $t_S$κ° 1λ³΄λ€ μλ€λ©΄ μλ‘μ΄ νλ₯ κ°μ μ§ν©μ μΆκ°νμλ λ°λμ μ΄λμ΄ λκ³ , 1λ³΄λ€ ν¬λ€λ©΄ λ°λμ μν΄κ° λκΈ° λλ¬Έμ΄λ€.
κ²°κ΅ λ΅μ΄ λλ μ§ν© $S$λ, μ¬κΈ°μ νλλΌλ λΉΌλ©΄ $t_S$ κ°μ΄ 1λ³΄λ€ μμμ§λ©΄μ, νμ¬ $t_S$κ°μ΄ 1λ³΄λ€ ν°, μΌμ’
μ maximalν λλμ μ§ν©μμ μ μ μλ€. (μ΄κ²μ maximal
μ΄λΌκ³ νμ) λ§μ½ νλλ₯Ό λΊμ λ $t_S$ κ°μ΄ 1λ³΄λ€ μ¬μ ν ν¬λ€λ©΄, κ·Έ νλ₯ μ λΉΌλ κ²μ΄ νμ μ΄λμ΄κΈ° λλ¬Έμ΄λ€. (μΆκ°νμ λ μν΄μμ κ²μ΄λ―λ‘) μ΄μ , μ΄λ―Έ μ ν΄μ§ μ§ν© $S$μμ, νλ₯ $a$λ₯Ό λΉΌκ³ λμ $b$λ₯Ό λ£μμ λ λμ€μ΄ μ΄λ»κ² λ³ννλμ§ μκ°ν΄ 보μ. $S$μμ $a$λ₯Ό λΊ μ§ν© $S_0$ μ λν΄, μ°λ¦¬κ° λΉκ΅ν΄μΌ νλ λμμ $S_0 \cup \Set{a}$ μ $S_0 \cup \Set{b}$ λ₯Ό λΉκ΅νλ κ²μ΄λ€. κ·Έλ°λ°, μ μ $p_{new} - p_S = pβ m_S - pβ m_S t_S$ μ 보면,
$(1 - t_{S_0})$ κ°μ΄ μμλΌλ©΄ $pβ$κ° ν΄μλ‘ μ΄λμμ μ μ μλ€. λ°λΌμ, $S_0 \cup \Set{b}$ μ νλ₯ μ΄ $S_0 \cup \Set{a}$λ³΄λ€ νμ λ ν¬λ€λ κ²μ μ μ μλ€.
λ°λΌμ, μ΄λ€ maximal
λΆλΆμ§ν© $S$μ λν΄, μ¬κΈ°μ μμ νλ₯ κ°μ μ κ±°νκ³ ν° νλ₯ κ°μ λ£λ κ²μ νμ μ΄λμ΄ λλ μ°μ°μ΄λ€ (maximal
μ μ μκ°, μ§ν© $S$μμ μμμ νλ₯ κ° νλλ₯Ό λΊ λ $t_S$ κ°μ΄ 1λ³΄λ€ μμμ§λ©°, νμ¬μ $t_S$κ°μ΄ 1λ³΄λ€ ν¬κ±°λ κ°μ μ§ν©μΌλ‘ νμλ€).
κ·Έλ¬λ―λ‘ Greedyν μ κ·Όμ΄ κ°λ₯νκ³ , 무쑰건 ν° νλ₯ κ°λΆν° λλ €λ£μΌλ©΄μ $t_S$κ°μ΄ 1 μ΄μμ΄ λλ μκ° λ©μΆλ κ²μ΄ optimalν λ°©λ²μμ μ μ μλ€. μκ° λ³΅μ‘λλ μ λ ¬λ§ νλ©΄ λλ¨Έμ§λ $O(n)$μ λκΈ° λλ¬Έμ $O(n \log n)$.
μ½λ
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#define ll long long
#define eps 1e-7
#define all(x) ((x).begin()),((x).end())
#define usecppio ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
#define int ll
using pii = pair<int, int>;
vector <double> probs;
double solve()
{
probs.clear();
int n; cin >> n;
for (int i = 0; i < n; i++)
{
double p; cin >> p;
probs.push_back(p);
}
sort(all(probs), greater<double>());
if (probs[0] >= 0.5)
return probs[0];
double s = 0, p = 1;
for (auto it:probs)
{
s += (it / (1 - it));
p *= (1 - it);
if (s >= 1) break;
}
return s * p;
}
int32_t main()
{
usecppio
int t;
cin >> t;
while(t--)
cout << fixed << setprecision(20) << solve() << '\n';
}