C++程式用於找出需要調動的不同技能等級的員工人數
假設一家公司有 n 名員工。每位員工根據其技能獲得一個排名。排名從 1 到 k。擁有排名 i 的員工數量在陣列 skill 中給出,其中 skill[i] 表示擁有排名 i 的員工數量。現在,公司開設了一個新部門,需要將不同技能的員工調到該部門。需要調往該部門的員工人數為 m。我們必須找到一種方法,以便我們可以將 m 名不同技能的員工調往新部門。我們必須最小化以下公式以獲得部門的員工排名分配表 branch。
公式為:max(branch[i]/m - skill[i]/n)。
branch[i] 的值之和為 m。我們必須找出 branch[i] 中的元素。
因此,如果輸入類似於 k = 5,n = 10,m = 25,skill = {5, 3, 2, 7, 4},則輸出將為 12 7 5 17 10。
步驟
為了解決這個問題,我們將遵循以下步驟:
sum := 0
for initialize i := 0, when i < k, update (increase i by 1), do:
skill[i] := skill[i] * m / n
Define an array a containing integer pairs
for initialize i := 0, when i < k, update (increase i by 1), do:
c := skill[i]
sum := sum + c
first value of a[i] := skill[i] - c
second value of a[i] := i
sort the array a
reverse the array a
for initialize i := 0, when i < m - sum, update (increase i by 1), do:
skill[second value of a[i]] := skill[second value of a[i]] + 1
for initialize i := 0, when i < k, update (increase i by 1), do:
if i is not equal to k - 1, then:
print(skill[i])
Otherwise,
print(skill[i])示例
讓我們看看以下實現以更好地理解:
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
void solve(int k, int n, int m, vector<double> skill){
int sum = 0;
for (int i = 0; i < k; i++)
skill[i] = skill[i] * m / n;
vector<pair<double, int>> a(k);
for (int i = 0; i < k; i++) {
int c = skill[i];
sum += c;
a[i].first = skill[i] - c;
a[i].second = i;
}
sort(a.begin(), a.end());
reverse(a.begin(), a.end());
for (int i = 0; i < m - sum; i++) {
skill[a[i].second] += 1;
}
for (int i = 0; i < k; i++) {
if (i != k - 1)
cout << int(skill[i]) << " ";
else
cout << int(skill[i]) << endl;
}
}
int main() {
int k = 5, n = 10, m = 25;
vector<double> skill = {5, 3, 2, 7, 4};
solve(k, n, m, skill);
return 0;
}輸入
5, 10, 25, {5, 3, 2, 7, 4}
輸出
12 7 5 17 10
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP