2010-06-30 2 views
0

В компании существует три категории: A, B, C.Вычислительная уплата заработной платы

Они хотят дать приращение. Поэтому, если категория C получает N% в качестве приращения. категория B получает 2N% в качестве приращения, а категория A получает 3N% в качестве приращения. Но прирост должен составлять не менее 1%, а общая обновленная зарплата не должна превышать 50 000 долларов США.

Распечатать приращение и общую обновленную зарплату для конкретного сотрудника.

Предположим все необходимые переменные.

Как я решаю выше, кажется, есть много неизвестных параметров, как SALARY A, SALARY B, SALARY C и приращение N. Ищите максимально возможное значение N в пределах ограничения

+1

Вы ищете _maximum_ возможное значение N в пределах ограничений? –

+0

Пожалуйста, прочитайте все ответы и обсуждения. –

ответ

4

Если вы хотите внедрить простое процедурное обновление сотрудников, вы не указали язык (что хорошо, поскольку я предоставляю только псевдокод для домашней работы в любом случае), но здесь это:

def update (N,MAX) 
    if N < 1: 
     return 
    for every employee E: 
     select E.catagory: 
      if 'C': 
       E.salary = E.salary * (1 +  N/100) 
      endif 
      if 'B': 
       E.salary = E.salary * (1 + 2 * N/100) 
      endif 
      if 'A': 
       E.salary = E.salary * (1 + 3 * N/100) 
      endif 
     endselect 
     if E.salary > MAX: 
      E.salary = MAX 
     endif 
     print E.name " is now on a wage of $" E.salary 
    endfor 
enddef 

Теперь ваша задача состоит в том, чтобы перевести это на любом языке, вы должны осуществить это в :-)


Если вы желаете для решения всех неизвестных в уравнении у вас есть проблема (противоречивые требования). Кажется, вы можете быть после значения N, которое сделает наибольшую заработную плату в 50 тысяч долларов.

Вам просто нужно пройти через каждый сотрудник и определить максимальный процент из:

def update (MAX) returns N: 
    N = Infinity 
    for every employee E: 
     select E.catagory: 
      if 'C': 
       ThisN = MAX/E.salary - 1 
      endif 
      if 'B': 
       ThisN = (MAX/E.salary - 1)/2 
      endif 
      if 'A': 
       ThisN = (MAX/E.salary - 1)/3 
      endif 
     endselect 
     if ThisN < N: 
      N = ThisN 
     endif 
    endfor 
    if N < 1: 
     # Conflicting requirement 
    endif 
enddef 

Можно придумать значение N это меньше, чем 1, если, например, сотрудник категории С уже на $ 50 тыс. Вам нужно решить, что вы хотите сделать в этом случае:

  • никому не дается payrise (нарушает правило> = 1%).
  • дать каждому 1% (нарушает правило ограничения $ 50K).
  • дают каждому 1%, но колпачок составляет 50 долларов США (нарушает правило множителя 1,2,3).

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

1

Чтобы просто работать максимальное N для любого набора заработной платы:

Если N является процент, пусть п N/100 (сделать математику проще). Пусть зарплата для каждой категории равна a, b и c соответственно.

Поскольку n> = 0.01, а зарплата плюс приращение < = 50000, и мы можем предположить, зарплата больше 0, то

0 < a <= 50000 * (1 - n) 
0 < b <= 50000 * (1 - 2 * n) 
0 < c <= 50000 * (1 - 3 * n) 

Последняя строка ставит сильное ограничение на п - т.е. 0,01 < = п < 0,333 .. .

вы, возможно, должны знать минимальную зарплату :)

Если у вас действительно есть данные для сотрудников, то максимальный N будет зависеть от максимальной зарплаты для работников в каждой категории.

max(a) <= 50000 * (1 - n) 
max(b) <= 50000 * (1 - 2 * n) 
max(c) <= 50000 * (1 - 3 * n) 

Таким образом, мы имеем несколько требований к п:

n <= 1 - max(a)/50000 
n <= 1/2 - max(b)/100000 
n <= 1/3 - max(c)/150000 

Так что вам просто нужно минимум значений справа.

+0

Вы не кодировали «A получает 3N, B получает 2N, C получает N» часть, между прочим. –

+0

Извините, Марк - это была незавершенная работа :) – sje397

+0

Приятно обсуждать с вами и благодарить за ваши комментарии –

0

Учитывая три Перечни заработной платы работников, A, B, C,

Set Increment=0% 
Set TempNewSalaries{A,B,C} = {A+3*Increment%, B+2*Increment%, C+Increment%} 
Set NewSalaries{A,B,C} = TempNewSalaries{A,B,C} 
While MaximumSalaryOfAll TempNewSalaries{A,B,C} <= 50000 
    Set NewSalaries{A,B,C} = TempNewSalaries{A,B,C} 
    Increment = (Increment+1)% 
    Set TempNewSalaries{A,B,C} = {A+3*Increment%, B+2*Increment%, C+Increment%} 
End While 
Return NewSalaries{A,B,C} 

картина здесь является:

  1. Установить, что более высокий прирост даст
  2. Validate, что эти значения будет по-прежнему действовать с учетом ваших ограничений
  3. Возврат максимально допустимого результата t, отбрасывая первый недействительный результат
+0

Что также может быть реализовано с использованием практически любого цикла и выбора валидации. – maxwellb

+0

Хотя это обновление всех записей о заработной плате всех сотрудников, поток может быть адаптирован к одному сотруднику. – maxwellb

0

Рассчитайте прирост между текущим окладом и 50 000 долларов США. ratio=(50000-current)/current. Затем конвертируйте в процент выше 100. N=100*ratio-100. Если Employee находится в категории C, верните N. Если Employee находится в категории B, N = N/2. Return N. Если Employee находится в категории A, пусть N = N/3. Возврат N.

+0

Это лучше всего подходит для одного сотрудника и категории, чтобы найти N для удовлетворения условий. – maxwellb

-1

Пропущенная переменная - это количество сотрудников в каждой категории, и, конечно, не все из них имеют одинаковую зарплату, поэтому нам нужна средняя зарплата и количество сотрудников в каждой категории.

Предположим, среднюю зарплату по категории А С.А., В представляет собой СО и С СК

Предположим Наймите номер для категории А является НС, В NB и С ЧПУ

затем

50,000 = ((3N*SA*NA) +(2N*SB*NB)+(N*SC*NC))/100 + ((SA*NA) +(SB*NB)+(SC*NC)) 

N= ((50,000 -((SA*NA) +(SB*NB)+(SC*NC))) *100)/((3*SA*NA)+(2*SB*NB)+(SC*NC)) 

пусть мы предполагаем, что константа K =100/ ((3*SA*NA)+(2*SB*NB)+(SC*NC))

M=((SA*NA) +(SB*NB)+(SC*NC)) 

количество 0<X<50000 и Y=N то Y=(X-M)*K линейное уравнение

+0

Использование среднего значения не будет соответствовать требованию, чтобы никакое приращение не наносило зарплату работнику более чем на 50 тыс. Лимитов. – sje397

+0

@ sje397: требование «Общая обновленная зарплата не должна превышать 50 000 долларов». и 5 * 10^6 исходят от 50 000 * 100 см. предыдущее уравнение. –

+0

@ Downvoter: будьте взрослым и расскажите всем, что не так с моим ответом. Докажите, что это неправильно –

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