Професионална програма
Loading...
+ Нов въпрос
nd_nikolov avatar nd_nikolov 6 Точки

Help for 4.Social Distribution from Lists Advanced - More Exercises.

Здравейте, ако някой е получил 100/100 на тази задача, би ли споделил с мен как го е постигнал. Опитах какво ли не, но явно пропускам нещо съществено защото две проверки не минават (60/100)
Ето и условието:

A core idea of several left-wing ideologies is that the wealthiest should support the poorest, no matter what and that is exactly what you are called to do for this problem.

On the first line you will be given the population (numbers separated by comma and space ", "). On the second line you will be given the minimum wealth. You have to distribute the wealth, so that there is no part of the population that has less than the minimum wealth. To do that, you should always take wealth from the wealthiest part of the population. There will be cases, where the distribution will not be possible. In that case, print "No equal distribution possible"

Example:

Input

Output

2, 3, 5, 15, 75

5

[5, 5, 5, 15, 70]

2, 3, 5, 15, 75

20

[20, 20, 20, 20, 20]

2, 3, 5, 45, 45

30

No equal distribution possible


population = input().split(', ')
wealth_level = int(input())
population_list = sorted(list(map(lambda x: int(x), population)))
max_element = max(population_list)
min_element = min(population_list)
length_population_list = len(population_list)
low_element = 0

if sum(population_list) / length_population_list < wealth_level or wealth_level == 0 or min_element >= wealth_level:
    print('No equal distribution possible')

else:
    for element in population_list:
        if element <= wealth_level:
            min_element = element
            population_list.remove(element)
            population_list.insert(0, wealth_level)
            population_list.remove(max_element)
            max_element -= (wealth_level - min_element)
            population_list.append(max_element)
        else:
            element = element

        max_element = max(population_list)

    print(population_list)
Тагове:
1
Python Fundamentals
niyazihasan avatar niyazihasan 69 Точки

Здравейте,

Ето примерно 100/100 решение, дано да Ви помогне да откриете какво пропускате.

numbers = [int(num) for num in input().split(", ")]
minimum_wealth = int(input())

for i in range(len(numbers)):
    if numbers[i] < minimum_wealth:
        c = minimum_wealth - numbers[i]
        max_number = max(numbers)
        if max_number - c >= minimum_wealth:
            numbers[numbers.index(max_number)] -= c
            numbers[i] += c
if sum(numbers) >= len(numbers) * minimum_wealth:
    print(numbers)
else:
    print("No equal distribution possible")

1
30/06/2020 22:51:31
nd_nikolov avatar nd_nikolov 6 Точки

Благодаря!

1
MartinBG avatar MartinBG 2680 Точки

Условието на задачата не е достатъчно конкретно, но ако приложим малко дедукция и логика ще стигнем до решение, подобно на това, което @nd_nikolov е дал:

- ако общото богатство е по-малко от брой хора * мин. богатство - No equal distribution possible

- винаги се взема от най-богатия (колкото трябва, без да се пада под мин. богатство) и се дава на най-бедния

- това се прави, докато всички имат поне мин. богатство

- изходът е сортиран по големина (предполага се от примерните тестове, но там и входът е сортиран)

 

Ако приложим горната логика, следните входни данни:

2, 6, 6, 6

5

Трябва да дадат резултат [5, 5, 5, 5]

 

Решението на @nd_nikolov ще изведе:

[5, 5, 6, 4]

Което очевидно е грешно

 

Решението на @niyazihasan ще изведе:

[2, 6, 6, 6]

 

Това е решението, което дава 100/100 в Judge, т.е. има вероятност и авторовото решение, използвано за генериране на двойките вход -> изход в Judge също да е имало подобен бъг... Или просто в Judge няма тест като този.smiley

 

При всички случаи, не си струва да се мъчите с изкарване на 100/100 в Judge за задачи, които са зле описани или има вероятност за грешно авторово решение (и съответно грешни отговори в системата).

Лошо е, когато това се случи с изпитна задача. sad

 

Иначе, ето едно решение, което с горния вход ще произведе коректен резултат, т.е. [5, 5, 5, 5]

population = [int(num) for num in input().split(", ")]
wealth_level = int(input())

if sum(population) < len(population) * wealth_level:
    print('No equal distribution possible')
else:
    population.sort()
    poorest_index = 0
    richest_index = len(population) - 1
    while population[poorest_index] < wealth_level:
        needed = wealth_level - population[poorest_index]
        can_take = population[richest_index] - wealth_level
        redistributed_wealth = min(needed, can_take)
        population[poorest_index] += redistributed_wealth
        population[richest_index] -= redistributed_wealth
        population.sort()

    print(population)

 

 

EDIT:

Стигнах да следното работещо решение (както в Judge, така и с горните примерни данни), като грешката беше в допускането, че резултата е сортиран по големина (т.е. не трябва да го сортираме):

population = [int(num) for num in input().split(", ")]
wealth_level = int(input())

if sum(population) < len(population) * wealth_level:
    print('No equal distribution possible')
else:
    poorest = min(population)

    while poorest < wealth_level:
        poorest_index = population.index(poorest)
        richest = max(population)
        richest_index = population.index(richest)

        needed = wealth_level - poorest
        can_take = richest - wealth_level
        redistributed_wealth = min(needed, can_take)
        population[poorest_index] += redistributed_wealth
        population[richest_index] -= redistributed_wealth

        poorest = min(population)

    print(population)

 

0
01/07/2020 02:12:44
nd_nikolov avatar nd_nikolov 6 Точки

Благодаря за коментарите и добрия съвет!

Ще го имам предвид на изпит.

1