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])

示例

让我们看看以下实现以更好地理解:

Open Compiler
#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; }

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

输入

5, 10, 25, {5, 3, 2, 7, 4}

输出

12 7 5 17 10

更新于: 2022年3月2日

180 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告