Блог пользователя yaro

Автор yaro, 12 лет назад, По-русски

Вполне симпатичная задача 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;
}
  • Проголосовать: нравится
  • +29
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Задачу не решал, но поставил бы, что 1 и 2 одинаково намного хуже, чем 3.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А я бы сказал что 3-я самая норм, 1-я хуже, но вроде не намного и проходимость таже, а вот вторая совсем плохо, ибо там ошибка будет дважды получена, вместо одного раза.