Форум » Массивы, сортировка, работа с файлами » Задача 26 (№2708 Е.Джобс) » Ответить

Задача 26 (№2708 Е.Джобс)

Казаков: Задача. 35) (Е. Джобс) В проекте «СкупойПлатитДважды» 1 января решено тратить на развитие 60% накоплений всех участников. При этом 20% самых богатых участников вносят 80% от своих накоплений, остальные участники вносят равный процент таким образом, чтобы общая сумма взносов всех участников составила 60%, обозначенные выше. Запишите в ответе два целых числа: сумма взноса от всех «богатых» участников проекта и сумма взноса участника с самым небольшим размером накоплений. Первый ответ сходится - 143518. А вот со вторым проблема. На сайте в ответе 4. Несколько раз проверил своё решение - 5! Либо подскажите где моя ошибка, либо ... ну, если не моя ошибка, то вам виднее, что там дальше делать. Моё решение: Var i,j,k,Sm,Sb,SUM,N,Kb,Km:integer; a:array[1..10000] of integer; f:text; Begin Assign(f,'C:\Users\User1\Downloads\26-j7.txt'); Reset(f); ReadLn(f,N); SUM:=0;Sb:=0;Kb:=round(N*0.2);Km:=n-Kb; For i:=1 to N do begin //заполнение массива и подсчёт общ суммы Read(f,a[ i ]); SUM:=SUM+a[ i ]; //все накопления end; Close(f); Writeln('ВСЕ накопления: ',SUM); For i:=1 to n-1 do //сортировка массива For j:=2 to n-i+1 do if a[j]<a[j-1] then begin a[j]:= a[j]+a[j-1]; a[j-1]:= a[j]-a[j-1]; a[j]:= a[j]-a[j-1]; end; For i:=Km+1 to N do Sb:=Sb+a[ i ]; WriteLn('Накопления богатых: ',Sb); WriteLn(round(Sb*0.8)); //все взносы богатых Sm:=SUM-Sb;WriteLn('Накопления бедных: ',Sm); //все накопления бедных SUM:=round(Sum*0.6);WriteLn('Общий взнос: ',SUM); Sb:=round(Sb*0.8);WriteLn('Взнос богатых: ',Sb); WriteLn('Ставка бедных: ',(SUM-Sb)/Sm); WriteLn(round(a[1]*(SUM-Sb)/Sm)); //взнос самого бедного end. Последние "Write"-ы - это я уже ошибку искал.

Ответов - 7

EugeneJobs: Необходимо привести целое число, полученное из суммы платежей. Это не округление, а взятие целой части.

VectorASD: Тажа беда :/ [pre2] def Z2708(): #N, Arr = Loader5("26-j7.txt") N, Arr = 10, sorted([10, 12, 25, 25, 40, 35, 18, 19, 10, 12]) T = int(N * 0.8) TP = N - T Proc = (0.6 * N - 0.8 * TP) / T print(Proc, (Proc * T + 0.8 * TP) / N == 0.6) print(int(sum(Arr[T:]) * 0.8)) print(min(Arr) * Proc) Z2708() [/pre2] Последний print вываливает 5.5, что при int дало бы 5, а у них в ответе 4 :/ Прикол в том, что высчитывается 55% (т.е. 0.55) и даже при попытке найти среднего арифметического, я получаю изначальные 60%, что доказывает правильность нахождения 55%, это видно в первом из 3 принтах. Т.е. должно было выпасть от 40 до 49%, чтобы самый бедный чел (накопления = 10) дал 4

VectorASD: Вопрос в том, как они находили свои 40-49% если правильным будет 55% что в среднем арифметическом нам возвращает наши 60% :/


EugeneJobs: Изучите решение тут: Разбор задачи (видео на Youtube)

VectorASD: EugeneJobs пишет: Изучите решение тут: Разбор задачи (видео на Youtube) Спасибо!!! Понимаю это чувство, когда башка не варит ;'-}}} Вы только меня подтолкнули на мыслю тем видео, разделить то, что не доплатили остальные (не богатые) на общую сумму, что есть у остальных. Вышло 0.48872955522338074, а это 48.9% по сути, а не 55% XD видимо средним арифметическим считать такое нельзя, вот я и сомневался, что коллизии будут ;'-}}} Вышло: [pre2] Вывод: Proc: 0.48872955522338074 143518 4 Сама прога, писанная мною :S : def Loader5(Name): with open(GPath + Name) as file: N = int(file.readline()) Arr = [int(file.readline()) for i in range(N)] Arr.sort() return N, Arr def Z2708(): N, Arr = Loader5("26-j7.txt") #N, Arr = 10, sorted([10, 12, 25, 25, 40, 35, 18, 19, 10, 12]) T = int(N * 0.8) TP = N - T #Proc = (0.6 * N - 0.8 * TP) / T #print(Proc, (Proc * T + 0.8 * TP) / N == 0.6) #print(int(sum(Arr[T:]) * 0.8)) #print(min(Arr) * Proc) B = sum(Arr[T:]) * 0.8 All = sum(Arr) * 0.6 A = All - B AllA = sum(Arr[:T]) Proc = A / AllA print("Proc:", Proc) print(int(B), int(min(Arr) * Proc)) Z2708() [/pre2]

ЕленаФом: Сортировка списка с денежными взносами сделана в обратном порядке, так удобнее вести расчеты [pre] # 20% самых богатых участников вносят 80% # остальные (бедные) - равный процент # общая сумма взносов всех участников составила 60% от исходных денег f = open("./26/26-j7.txt") n = int(f.readline().strip()) x = [0]*n for i in range(n): x = int(f.readline().strip()) f.close() x.sort(reverse=True) n20 = n // 5 # количество богатых 20% s100 = sum(x) sRich = sum(x[0:n20]) sLow = sum(x[n20+1:]) # s60 = sRich * 0.8 + sLow * proc = s100 * 0.6 proc = (s100 * 0.6 - sRich * 0.8)/sLow sRichItog = sRich * 0.8 sLowItog = sOther* proc print("Кол-во богатых = ", n20) print("S всех денег = ", s100 ) print("s Rich = ", sRich) print("s Low = ", sLow ) print(f"% внесенный бедными = {proc*100:10.3f} \n") print("60% от s100 = ", s100*0.6) print(f"от богатых = {sRichItog:10.3f}") print(f"от бедных = {sLowItog :10.3f}", ) print(f"min взнос = {x[n-1]*proc:10.3f}") [/pre] # ОТВЕТ: 143518 4 #1. сумма взноса от всех богатых участников #2. взноса участника с min накоплений.

ЕленаФом: Опечатка. Вместо sOther надо sLow в строке sLowItog = sLow* proc



полная версия страницы