2017-02-12 21 views
9

Я написал решение для this competitive programming problem. Он прошел все тестовые примеры, за исключением того, что он был отключен одним из последних случаев, и я не могу понять, почему. Проблема может быть сформулирована следующим образом: учитывая, сколько копеек каждый человек в группе имеет, сколько денег нужно переменить руками, чтобы все в группе были в пределах одной копейки друг от друга в богатстве?Невозможная ошибка в программе, которая выравнивает богатство в группе (UVA 10137, «The Trip»)

Моя программа проста. Я изменил его, чтобы просто работать на массиве, сколько грошей у каждого есть:

def transfer(A): 
    A.sort(key = lambda x:-x) 
    extra = sum(A) % len(A) 
    average = sum(A) // len(A) 

    high = sum([abs(x - (average+1)) for x in A[:extra]]) 
    low = sum([abs(x - average) for x in A[extra:]]) 

    return (high+low)/2 

тест так, что он не на следующий:

print(transfer([613, 944, 7845, 8908, 12312, 22378, 27877, 54757, 55476, 90707, 91289, 178189])) 

Мой код говорит ответ 240710, в то время как «правильный» ответ - 240709. Где моя ошибка?

+0

Я склонен думать, что у вас на самом деле была ошибка где-то в долларах -> пенни или пенни -> доллар конверсия из-за округления с плавающей запятой. – user2357112

+0

Нет, тестовый пример с точки зрения гроши, а неправильный ответ также относится к пенни. Спасибо, хотя :) –

+3

Я думаю, что нет ошибки, и ваш код правильный – samgak

ответ

0

По-видимому, консенсус в том, что я получил другой ответ: я использую исключительно целочисленную арифметику, и их ответ использует арифметику float. Хотя их алгоритм был бы прав в бесконечной точности, выясняется, что в этом случае, по странной случайности, неточность float дает зачет. Это подтверждается gcc компилятором кода, который дает другой ответ, чем мой, но clang компиляция кода, который дает тот же ответ, который я нашел.

-1

Проблема с программированием: Ваша задача состоит в том, чтобы вычислить из списка расходов минимальную сумму в размере денег, которые должны сменить руки, чтобы уравнять (в процентах) все расходы учащихся.

Это не то же самое, что и все, имеющие одинаковое богатство в пределах копейки. Это означает, что каждый обмен денег должен быть в пределах копейки. Плохая формулировка, с некоторой путаницей в интерпретации. Но пойдем с этим.

Существует пять человек, которые превышают среднюю величину 45941,25. Это люди, которые дают деньги другим. Но когда дается менее одного копейки, им не нужно давать этот дробный процент. Чтобы узнать, сколько людей не нужно сдать дополнительный цент:

extra = len([x for x in A if x > sum(A)/len(A)]) 

final = initial - difference. При проверке значения final находятся в пределах одного копейки.

initial = [178189, 91289, 90707, 55476, 54757, 27877, 22378, 12312, 8908, 7845, 944, 613] 
difference = [132247, 45347, 44765, 9534, 8815, -18064, -23563, -33629, -37033, -38096, -44997, -45328] 
final = [45942, 45942, 45942, 45942, 45942, 45941, 45941, 45941, 45941, 45941, 45940, 45940] 

пяти людей, у которых слишком много денег дают [132247, 45347, 44765, 9534, 8815] грошей прочь, раздавать в общей сложности 240708 cents. Кажется, это красиво.

Обратите внимание, что это меньшее значение, чем приведенное выше решение!

+0

Обратите внимание, что «решение» на самом деле неверно. Если вы посмотрите на «финал», два человека с 45942 должны дать один пенни двум 45940-м годам даже до того.По результатам проверки мы видим, что это решение, которое я предложил, немного подозрительно. Но реальным способом решения проблемы было бы создание правильных значений в финале, а затем вычесть их из начальных значений. –

+0

Если вы добавите два ответа, вы получите мой ответ. И ваш предыдущий комментарий указывает, что вы должны добавить два ответа. Поэтому я не уверен, что вижу, как это контрпример. –

+0

Извините Рене Г, контрпример - это то, что я показал (большую часть) работу, необходимую для проверки «окончательного». Легко видеть, что окончание «в пределах одного пенни» = [45942, 45942, 45942, 45941, 45941, 45941, 45941, 45941, 45941, 45941, 45941, 45941] и затем вычисление остатка. –

 Смежные вопросы

  • Нет связанных вопросов^_^