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