![]() |
Модераторы: Alx, Fixin |
![]() ![]() ![]() |
|
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Делаю олимпиаду дальше.
Упор делается на нестандартность алгоритма, неординарность идеи и т.д..
Имхо здесь простора для креатива уже больше, чем в задаче 9. Вариант 1. Можно просто каждый раз тупо искать минимальную зарплату, добавлять к ней 1, уменьшать кол-во выделенных средст на 1, снова искать мин.зарплату.... (за простой перебор никто даже 1 балла не даст, я думаю) Вариант 2. 1. Можно из максимальной зарплаты вычесть меньшие. (например, если зарплаты 5, 6, 8, 10, 10, 13, 14, 15 и 15, то мы делаем так: 15-5=10; 15-6=9; 15-8=7; 15-10=5; 15-13=2; 15-14=1.) 2. Потом сложить полученные результаты. (10+9+7+5+2+1=34) 3. Затем из выделенных средств вычесть это число. (если выделенные средства равны 50, то 50-34=16) 4. Затем - целочисленное деление оставшихся средств на (кол-во_рабочих-1). (16:(9-1)=2) 5. Добавить к максимальной зарплате это число. (15+2=17) 6. Минимальная зарпалата после надбавки - последнее число. (17). 3,5. Добавить между 3 и 4 пунктами небольшой механизм, определяющий, хватит и выделенных средств на доведение зарплат всех рабочих до одного уровня. Если не хватит, то: 1. Из необходимых средст вычесть выделенные. (необходимо: 15; выделено: 7; 15-7=8) 2. Целочисленное деление недостатка средств на (кол-во_рабочих-1). (рабочих: 4; 8:(4-1)=2). 3. Увеличить последнее число на единицу. (2+1=3). 4. Вычесть из максимальной зарплаты до надбавки последнее число. (макс.ЗП до ндбавки: 12; 12-3=9). 5. Последнее число - минимальная ЗП после надбавки. (9). Вариант 3. ![]() ![]() ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 3 Всего: 459 |
Я бы сделал так, отсоритровал зарплаты по возрастанию
1) заполнил массив разностями z[2]-z[1], z[3]-z[2], и т.д. 2) дальше сумировал z[2]-z[1] + (z[3]-z[2]) * 2 + (z[4]-z[3]) * 3, до тех пор пока не наберется нужное число, или не достигнем (n-1) шага, далее делим все что осталось на всех. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
alexeis1, прикольный вариант (и, главное, рабочий!!)
![]() ![]() И красиво, и даже эстетично, и, имхо, очень неординарно! ![]() ![]() (ну почему, ну почему я не могу повышать репутацию!! ![]() ![]() Сейчас мы всю эту красоту попытаемя оформить в код: ![]() (оформлять буду долго, т.к. переменных надо много, легко запутаться и т.д.) |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Вот что у меня получилось:
(и оно не работает по непонятным мне причинам: просто перед выводом минимальной ЗП после надбавки виснет и все (т.е. где-то замкнутый цикл, но я не могу его найти))
|
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
покопай цикл, который начинается в 30 строке. это единственный цикл, который может закольцеваться.
|
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
z - сначала массив с зарплатами, позже массив с раностями z[2]-z[1] и т.д.;
s - выделенные средства; k- количество рабочих; i - номер элемента массива z в цикле; j - вспомогательная переменная для организаци механизма сортировки; c - переменная для временного хранения значения z[i] при z[i]:=z[i+1] и z[i+1]:=z[i]; max - максимальная зп до надбавки; min - минимальная зп после надбавки; r - сумма средств, необходимых для выравнимания всех зп; o - остаток средст после выравнивания всех зп. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
потом в 25 строке у тебя счетчик выходит за пределы массива: z[i+1] при i=k - несуществующий элемент.
Добавлено @ 18:55 а как быть, если зарплаты выровнены? кому добавлять? и добавлять ли вообще? Добавлено @ 19:02 какие входные данные, на которых программа входит в бесконечный цикл? |
|||
|
||||
KasMP |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Мне это тоже не нравится, но как это устранить, я не знаю (остается только утешаться тем, что на выводимом на экран результате это не сказывается) ((щас skyboy найдет тысячу и одну ошибку и раскритикует мое маленькое творчество в пух и прах ![]() ![]() ![]()
Если они выравнены, то мы делаем целочисленное деление остатка средств на кол-во рабочих. Результат записываем в plus. И потом прибавляем plus к максимальной зарплате до начало надбавки и получаем минимальную зарплату после надбавки.
Да впринципе любые... ![]() |
||||||
|
|||||||
skyboy |
|
||||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
дык, у тебя же ниже цикл до k-1 идет, что тебе мешает и здесь так же сделать? ![]()
не дождешься ![]()
Странно ![]() Добавлено @ 19:20 дык, при равных зарплатах мы из цикла в 30 строке и не выйдем... |
||||
|
|||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Эмм... не знаю, мозги устали, ничего не понимаю... посмотрим.... ![]() к моменту начала этого цикла зп не выравнены. там просто подсчитывается, сколько средств понадобилась бы для выравнивания всех зп. при этом значений зп уже нет, остались только разности z[2]-z[1] (с помощью которых и высчитывается кол-во необходимых для выравнивания средств). и вэтом цикле к зп ничего не прибавляется и не убавляется, а просто выдвигается предположение о том, сколько средств понадобилаось бы. |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Теперь все сделано немного по-другому:
s - выделенные средства; r - средства, необходимые для выравнивания зарплат всех рабочих; k - кол-во рабочих; z - массив с зарплатами (затем отсортированный по возрастанию); c - сначала - переменная для временного хранения значения элемента массива z при сортировке; затем - минимальная зарплата после надбавки; j - сначала - вспомогательная переменная для организации механизма сортировки; затем - кол-во рабочих с максимальными зарплатами (до надбавки); i - переменная для организации циклов и т.д.. Заполняем массив z зарплатами, делаем сортировку по возрастанию. Потом считаем кол-во неоходимых средств для выравнимания всех зарплат (из максимального элемента массива z вычитаем все остальные элементы и полученные результаты суммируем). Потом сравниваем необходимые средства с выделенными: а) если s>=r, то делаем целочисленное деление оставшихся после выравнивания средств на кол-во рабочих; потом суммируем результат и максимальную зарплату до надбавки; полученное число - минимальная зарпалат после надбавки; б) если s<r, то .... ![]() Помогите, пожалуйста, сделать эту часть! ![]() З.Ы.. Сортировка вынесена в отдельную процедуру, т.к., во-первых, мне так удобней и наглядней, а, во-вторых, зная критерии оценки тех, кому надо сдавать эту задачку, можно рассчитывать на получение доп.баллов за эту процедуру.
|
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Интересные и занимательные задачи по программированию | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |