Модераторы: Alx, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Задача №5, заочная олимпиада по информатике 
:(
    Опции темы
KasMP
Дата 15.10.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: 2
Всего: 30



Делаю олимпиаду дальше.
Упор делается на нестандартность алгоритма, неординарность идеи и т.д..

Цитата
5. На заводе работает N рабочих с различными зарплатами. Директор решает повысить зарплату, выделяя им каждый месяц дополнительную сумму денег: 1 рубль добавляется к наименьшей зарплате, затем заново анализируются все зарплаты и опять к наименьшей добавляется 1 рубль, пока все средства не будут исчерпаны. Определить наименьшую зарпдату на предприятии после надбавки.

Пример.
Исходные данные:
сумма выделенных средств - 9;
число рабочих - 3;
зарплата 1 рабочего - 4;
зарплата 2 рабочего - 6;
зарплата 3 рабочего - 3;
Ответ: 7.


Имхо здесь простора для креатива уже больше, чем в задаче 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.
 smile smile smile 
PM MAIL   Вверх
Alexeis
Дата 15.10.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 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 вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
KasMP
Дата 16.10.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: 2
Всего: 30



alexeis1, прикольный вариант (и, главное, рабочий!!) smile  smile

И красиво, и даже эстетично, и, имхо, очень неординарно! smile  smile 
(ну почему, ну почему я не могу повышать репутацию!! smile  smile )

Сейчас мы всю эту красоту попытаемя оформить в код: smile
(оформлять буду долго, т.к. переменных надо много, легко запутаться и т.д.)
PM MAIL   Вверх
KasMP
Дата 16.10.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: 2
Всего: 30



Вот что у меня получилось:
(и оно не работает по непонятным мне причинам: просто перед выводом минимальной ЗП после надбавки виснет и все (т.е. где-то замкнутый цикл, но я не могу его найти))
Код
var    z: array [1..1000] of integer;
    plus, o, r, i, j, k, s, c, min, max: integer;

begin
writeln ('Сумма выделенных средств равна:'); readln (s);
writeln ('Количество рабочих равно:'); readln (k);

for i:=1 to k do begin
    writeln ('Введите зарплату рабочего ', i);
    readln (z[i]);
    end;

for j:=1 to k do begin
    for i:=1 to k-j do if z[i]>z[i+1] then begin
        c:=z[i];
        z[i]:=z[i+1];
        z[i+1]:=c;
        end;
    end;

max:=z[k];

writeln ('Зарплаты рабочих до надбавки');
for i:=1 to k do begin
    write (z[i], ', ');
    z[i]:=z[i+1]-z[i];
    end;

while s>0 do begin
    for i:=1 to k-1 do begin
        r:=z[i]*i;
        s:=s-r;
        end;
    end;
o:=s+r;
plus:=o div(k);
min:=max+plus;
writeln (min);
readln;
end.

PM MAIL   Вверх
skyboy
Дата 16.10.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



покопай цикл, который начинается в 30 строке. это единственный цикл, который может закольцеваться.
PM MAIL   Вверх
KasMP
Дата 16.10.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 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 - остаток средст после выравнивания всех зп.
PM MAIL   Вверх
skyboy
Дата 16.10.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



потом в 25 строке у тебя счетчик выходит за пределы массива: z[i+1] при i=k - несуществующий элемент.

Добавлено @ 18:55 
а как быть, если зарплаты выровнены? кому добавлять? и добавлять ли вообще?

Добавлено @ 19:02 
какие входные данные, на которых программа входит в бесконечный цикл?
PM MAIL   Вверх
KasMP
Дата 16.10.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: 2
Всего: 30



Цитата(skyboy @  16.10.2006,  18:54 Найти цитируемый пост)
потом в 25 строке у тебя счетчик выходит за пределы массива: z[i+1] при i=k - несуществующий элемент.

Мне это тоже не нравится, но как это устранить, я не знаю (остается только утешаться тем, что на выводимом на экран результате это не сказывается)
((щас skyboy найдет тысячу и одну ошибку и раскритикует мое маленькое творчество в пух и прах smile)
 smile  smile)

Цитата(skyboy @  16.10.2006,  18:54 Найти цитируемый пост)
а как быть, если зарплаты выровнены? кому добавлять? и добавлять ли вообще?

Если они выравнены, то мы делаем целочисленное деление остатка средств на кол-во рабочих. Результат записываем в plus. И потом прибавляем plus к максимальной зарплате до начало надбавки и получаем минимальную зарплату после надбавки.
Цитата(skyboy @  16.10.2006,  18:54 Найти цитируемый пост)
какие входные данные, на которых программа входит в бесконечный цикл? 

Да впринципе любые... smile Еще раза не было, чтобы было выведено хоть какое-то значение min.


PM MAIL   Вверх
skyboy
Дата 16.10.2006, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(KasMP @  16.10.2006,  18:09 Найти цитируемый пост)
Мне это тоже не нравится, но как это устранить, я не знаю

дык, у тебя же ниже цикл до k-1 идет, что тебе мешает и здесь так же сделать?  smile 
Цитата(KasMP @  16.10.2006,  18:09 Найти цитируемый пост)
щас skyboy найдет тысячу и одну ошибку и раскритикует мое маленькое творчество в пух и прах 

не дождешься  smile 
Цитата(KasMP @  16.10.2006,  18:09 Найти цитируемый пост)
Да впринципе любые... Еще раза не было, чтобы было выведено хоть какое-то значение min

Странно smile Посмотрим дальше...

Добавлено @ 19:20 
дык, при равных зарплатах мы из цикла в 30 строке и не выйдем...
PM MAIL   Вверх
KasMP
Дата 16.10.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: 2
Всего: 30



Цитата(skyboy @  16.10.2006,  19:18 Найти цитируемый пост)
дык, у тебя же ниже цикл до k-1 идет, что тебе мешает и здесь так же сделать? smile 

Эмм... не знаю, мозги устали, ничего не понимаю...
Цитата(skyboy @  16.10.2006,  19:18 Найти цитируемый пост)
не дождешься smile 

посмотрим.... smile 
Цитата(skyboy @  16.10.2006,  19:18 Найти цитируемый пост)
дык, при равных зарплатах мы из цикла в 30 строке и не выйдем... 

к моменту начала этого цикла зп не выравнены. там просто подсчитывается, сколько средств понадобилась бы для выравнивания всех зп. при этом значений зп уже нет, остались только разности z[2]-z[1] (с помощью которых и высчитывается кол-во необходимых для выравнивания средств). и вэтом цикле к зп ничего не прибавляется и не убавляется, а просто выдвигается предположение о том, сколько средств понадобилаось бы.
PM MAIL   Вверх
KasMP
Дата 18.10.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: 2
Всего: 30



Теперь все сделано немного по-другому:
s - выделенные средства;
r - средства, необходимые для выравнивания зарплат всех рабочих;
k - кол-во рабочих;
z - массив с зарплатами (затем отсортированный по возрастанию);
c - сначала - переменная для временного хранения значения элемента массива z при сортировке; затем - минимальная зарплата после надбавки;
j - сначала - вспомогательная переменная для организации механизма сортировки; затем - кол-во рабочих с максимальными зарплатами (до надбавки);
i - переменная для организации циклов и т.д..

Заполняем массив z зарплатами, делаем сортировку по возрастанию. Потом считаем кол-во неоходимых средств для выравнимания всех зарплат (из максимального элемента массива z вычитаем все остальные элементы и полученные результаты суммируем).

Потом сравниваем необходимые средства с выделенными:
а) если s>=r, то делаем целочисленное деление оставшихся после выравнивания средств на кол-во рабочих; потом суммируем результат и максимальную зарплату до надбавки; полученное число - минимальная зарпалат после надбавки;
б) если s<r, то ....  smile ; вообще алгоритм есть, но я не знаю, как его оформить в код (уже голову сломала, никак не получается!!); я бы сделала так: сравнила бы z[1] (минимальную зарплату) с z[2]; если z[1] окажется меньше, то я бы увеличивала z[1] до тех пор, пока z[1] не будет равно z[2]; если z[1] равно z[2], то я бы сравнила z[2] и z[3]; после уравнивания z[1] и z[2] я бы сравнила z[2] и z[3]; если z[2]<z[3],  я бы увеличивала попеременно z[1] и z[2] до тех пор, пока z[1], z[2] и z[3] не будут равны и т.д..
Помогите, пожалуйста, сделать эту часть! smile 

З.Ы.. Сортировка вынесена в отдельную процедуру, т.к., во-первых, мне так удобней и наглядней, а, во-вторых, зная критерии оценки тех, кому надо сдавать эту задачку, можно рассчитывать на получение доп.баллов за эту процедуру.
Код

type    massiv= array [1..1000] of integer;
var    z: massiv;
    c, i, j, k, r, s: integer;

Procedure Sort (var e: massiv);
begin
for j:=1 to k do begin
    for i:=1 to k-j do if e[i]>e[i+1] then begin
        c:=e[i];
        e[i]:=e[i+1];
        e[i+1]:=c;
        end;
    end;
end;


begin

writeln ('Введите сумму выделенных средств:'); read (s);
writeln ('Введите кол-во рабочих:'); read (k);
writeln ('Введите зарплаты рабочих.');
for i:=1 to k do begin
    writeln ('Зарплата рабочего ', i, ' равна:');
    read (z[i]);
    end;

Sort (z);

writeln ('Зарплаты рабочих до надбавки:');
for i:=1 to k do write (z[i], ', ');

j:=1; r:=0;
for i:=1 to k-1 do begin
    if z[i]=z[k] then inc(j);  {j - кол-во рабочих с максимальными зарплатами}
    r:=r+(z[k]-z[i]); {r - средства, необходимые для выравнивания зарплат}
    end;

if s>=r then c:=(s-r) div(k)+z[k];


writeln ('Минимальная зарплата после надбавки равна­ ', c, '.');
readln; readln;
end.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Интересные и занимательные задачи по программированию | Следующая тема »


 




[ Время генерации скрипта: 0.1001 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.