Вполне симпатичная задача 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;
}
Задачу не решал, но поставил бы, что 1 и 2 одинаково намного хуже, чем 3.
А я бы сказал что 3-я самая норм, 1-я хуже, но вроде не намного и проходимость таже, а вот вторая совсем плохо, ибо там ошибка будет дважды получена, вместо одного раза.