2010-06-30 118 views
0

在一家公司中,有三类:A,B,C。计算工资增量

他们想给一个增量。所以如果C类以增量的形式获得N%。 B类的增量为2N%,A类的增量为3N%。但增量应该至少为1%,总更新薪水不应超过5万美元。

打印增量和特定员工的总更新薪水。

假设所有需要的变量。

我如何解决以上,似乎有许多未知的参数,如SALARY ASALARY BSALARY C,并增加N。 在限制范围内寻找N的最大可能值

+1

您是否正在寻找限制范围内的_maximum_的可能值? – 2010-06-30 03:27:51

+0

请阅读所有答案和讨论。 – 2010-06-30 06:27:53

回答

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的价值之后,这将使最大工资达到5万美元。

你只需要通过每一位员工,并计算最大百分比出来:

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,如果,例如,C类员工已经在5万美元了。你需要决定你想在这种情况下做什么,或者:

  • 给予没有人的薪酬(违反> = 1%规则)。
  • 给予每个人1%(违反5万美元的上限规则)。
  • 给予每个人1%但上限为5万美元(违反1,2,3倍增规则)。

一旦你从代码(你什么为相互冲突的要求做决定)增加的百分比,你可以将它传递到第一块上面的代码实际上和打印更新。

1

要刚工作了最大值N的任何一组的工资:

如果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) 

最后一行把最强的限制上N - 即0.01 < = N < 0.333 .. 。

您可能需要知道最低工资:)

如果你确实有数据为员工,那么最多N将取决于最高工资在每个类别的员工。

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

所以我们有几个要求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”部分等等。 – 2010-06-30 04:05:23

+0

对不起马克 - 这是一个正在进行的工作:) – sje397 2010-06-30 04:26:06

+0

与你很好的讨论和感谢您的意见 – 2010-06-30 07:13:29

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. 验证这些值考虑到您的限制,仍然有效
  3. 重复
  4. 返回最大有效结果,丢弃第一个无效结果
+0

这也可以使用几乎任何循环和验证的选择来实现。 – maxwellb 2010-06-30 04:31:52

+0

虽然这是更新所有员工的所有薪水记录,但流程可以适用于单个员工。 – maxwellb 2010-06-30 04:33:26

0

计算当前工资和$ 50,000之间的增量。 ratio=(50000-current)/current。然后转换为100以上的百分比。N=100*ratio-100。如果员工属于C类,则返回N.如果员工属于B类,则设N = N/2。如果员工属于A类,则让N = N/3。返回N.

+0

这对于一名员工和类别找到满足条件的N最有效。 – maxwellb 2010-06-30 04:37:38

-1

缺少的变量是每个类别中的员工数量,当然并不是所有人都有相同的工资,这就是为什么我们需要平均工资和每个类别中的员工数量。

假设平均工资A类是SA,B是SB和C是SC

假定为A类的录用数为NA,B是NB和C是NC

然后

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<50000Y=N 然后Y=(X-M)*K线性方程

+0

使用平均值将不符合在50k限额内没有增加任何员工工资的要求。 – sje397 2010-06-30 05:37:08

+0

@ sje397:要求是“总更新薪水不应超过$ 50,000”。和5 * 10^6来自50,000 * 100参见前面的等式。 – 2010-06-30 05:44:47