623D - Birthday - CodeForces Solution


greedy math probabilities *2700

Please click on ads to support us..

C++ Code:

#include <cstdio>
#include <queue>
#include <vector>

using fp = long double;

int main()
{
	int N;
	scanf("%d", &N);
	std::vector<fp> p(N);
	for(int i=0;i<N;++i)
	{
		int x;
		scanf("%d", &x);
		p[i] = (fp)x/100;
	}

	fp ans = (fp)N;
	std::vector<fp> pprod(N);
	std::vector<fp> gain(N);

	fp opt = 1;
	for(int i=0;i<N;++i)
	{
		opt *= 1 - (pprod[i] = (1 - p[i]));
		gain[i] = (1 - pprod[i] * (1 - p[i])) / (1 - pprod[i]);
	}

	auto cmp = [&](int a, int b) {return gain[a] < gain[b];};

	std::priority_queue<int, std::vector<int>, decltype(cmp)> q(cmp);
	for(int i=0;i<N;++i) q.push(i);

	ans += 1 - opt;
	for(int t=0;t<1000000;++t)
	{
		int v = q.top();
		q.pop();
		opt *= gain[v];
		pprod[v] *= (1 - p[v]);
		ans += 1 - opt;

		gain[v] = (1 - pprod[v] * (1 - p[v])) / (1 - pprod[v]);
		q.push(v);
	}
	printf("%.9lf\n", (double)ans);
	return 0;
}


Comments

Submit
0 Comments
More Questions

1108B - Divisors of Two Integers
1175A - From Hero to Zero
1141A - Game 23
1401B - Ternary Sequence
598A - Tricky Sum
519A - A and B and Chess
725B - Food on the Plane
154B - Colliders
127B - Canvas Frames
107B - Basketball Team
245A - System Administrator
698A - Vacations
1216B - Shooting
368B - Sereja and Suffixes
1665C - Tree Infection
1665D - GCD Guess
29A - Spit Problem
1097B - Petr and a Combination Lock
92A - Chips
1665B - Array Cloning Technique
1665A - GCD vs LCM
118D - Caesar's Legions
1598A - Computer Game
1605A - AM Deviation
1461A - String Generation
1585B - Array Eversion
1661C - Water the Trees
1459A - Red-Blue Shuffle
1661B - Getting Zero
1661A - Array Balancing