yaro's blog

By yaro, 12 years ago, In Russian

Вполне симпатичная задача C (div.1) с прошедшего раунда порадовала обилием тонкостей, на которые можно было напороться при ее неаккуратном написании.

Возьмем, к примеру, ключевой момент кода — переход динамики. Один из этих вариантов (угадайте, какой) прошел вчера претесты, но этим дело и ограничилось — получил вердикт WA (по точности) на каком-то объемном тесте.

А теперь вопрос: как вы думаете, какие из этих вариантов получают ОК по задаче? Почему?

Версия 1:

for (int j = 0; j < p[u].length; j++) {
	double np = (1 - (double) j / a[u]) * p[u][j];
	if (j < p[u].length - 1) {
		np += (double) (j + 1) / a[u] * p[u][j + 1];
	}
	p[u][j] = np;
}

Версия 2:

double frac = (double) 1 / a[u];
for (int j = 0; j < p[u].length; j++) {
	double np = (1 - j * frac) * p[u][j];
	if (j < p[u].length - 1) {
		np += (j + 1) * frac * p[u][j + 1];
	}
	p[u][j] = np;
}

Версия 3:

for (int j = 0; j < p[u].length; j++) {
	double np = (double) (a[u] - j) / a[u] * p[u][j];
	if (j < p[u].length - 1) {
		np += (double) (j + 1) / a[u] * p[u][j + 1];
	}
	p[u][j] = np;
}
  • Vote: I like it
  • +29
  • Vote: I do not like it