Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 직원의 성과에 따라 직원에게 최종적으로 지불해야 하는 금액을 찾는 프로그램


성능과 비용이라는 길이가 같은 두 개의 숫자 목록이 있다고 가정합니다. 그리고 또 다른 숫자 k가 있습니다. 이는 각 작업자 i가 성능[i] 수준에서 수행하고 비용이 최소한 비용[i]임을 나타냅니다. 직원들이 그룹의 다른 직원에 비해 성과에 비례하여 급여를 받을 것이라는 점을 감안할 때 k 직원을 고용하기 위한 최소 비용을 찾아야 합니다.

따라서 입력이 performance =[5, 3, 2] 비용 =[100, 5, 4] k =2와 같으면 emp1과 emp2를 선택할 수 있으므로 출력은 10이 됩니다. 그들은 최소한 5 + 4 =9 금액을 지불해야 합니다. 그러나 emp1은 emp2보다 1.5배 더 나은 성능을 발휘하므로 최소한 1.5 * 4 =6을 지불해야 합니다. 따라서 총 6 + 4 =10을 받게 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • n :=c의 크기

  • n

    크기의 배열 시퀀스 정의
  • seq를 0에서 n−1까지의 값으로 채웁니다.

  • 이 기준에 따라 배열 seq를 정렬합니다. (c[i] * p[j]

  • ans :=inf, psum :=0

  • 우선순위 큐 pq 정의

  • initialize i :=0의 경우, i

    • idx :=seq[i]

    • pq에 p[idx] 삽입

    • psum :=psum + p[idx]

    • 크기가 pq> k인 경우 -

      • psum :=psum - pq의 최상위 요소

      • pq에서 최상위 요소 삭제

    • i>=k − 1이면 −

      • ans :=ans의 최소값 및 (c[idx] / p[idx] * psum)

  • 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
double solve(vector<int>& p, vector<int>& c, int k) {
   int n = c.size();
   vector<int> seq(n);
   for (int i = 0; i < n; ++i)
   seq[i] = i;
   sort(seq.begin(), seq.end(), [&](int i, int j) { return c[i] *
   p[j] < c[j] * p[i]; });
   double ans = INT_MAX, psum = 0;
   priority_queue<int> pq;
   for (int i = 0; i < n; ++i) {
      int idx = seq[i];
      pq.emplace(p[idx]);
      psum += p[idx];
      if (pq.size() > k) {
         psum −= pq.top();
         pq.pop();
      }
      if (i >= k − 1)
      ans = min(ans, (double)c[idx] / p[idx] * psum);
   }
   return ans;
}
int main(){
   vector<int> performance = {5, 3, 2};
   vector<int> costs = {100, 5, 4};
   int k = 2;
   cout << solve(performance, costs, k);
}

입력

{5, 3, 2}, {100, 5, 4}, 2

출력

10