Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để tìm ra số lượng nhân viên ở các cấp độ kỹ năng khác nhau sẽ được chuyển giao

Giả sử, có n nhân viên trong một công ty. Mỗi nhân viên được xếp hạng dựa trên kỹ năng của họ. Các cấp bậc được đánh số từ 1 đến k. Số lượng nhân viên có cấp bậc i được đưa ra trong kỹ năng mảng, trong đó kỹ năng [i] thể hiện số lượng nhân viên có cấp bậc i. Bây giờ, một chi nhánh mới của công ty đã được mở ra và nhân viên với các kỹ năng khác nhau phải được điều chuyển đến chi nhánh đó. Số lao động cần cử đến chi nhánh đó là m. Chúng tôi phải tìm cách để có thể chuyển m nhân viên có kỹ năng khác nhau đến chi nhánh mới đó. Chúng ta phải thu nhỏ công thức sau để có được bảng phân bổ cấp bậc nhân viên của chi nhánh.

Công thức là:max (branch [i] / m - skill [i] / n).

Tổng các giá trị của nhánh [i] cho kết quả là m. Chúng ta phải tìm ra các phần tử trong nhánh [i].

Vì vậy, nếu đầu vào là k =5, n =10, m =25, skill ={5, 3, 2, 7, 4}, thì đầu ra sẽ là 12 7 5 17 10.

Các bước

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

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

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

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

Đầu vào

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

Đầu ra

12 7 5 17 10