야근 지수가 가장 적게끔 일을 해서 그 결과를 리턴해 주면 되는 문제이다. 최대한 높은 작업량 순으로 하나씩 일을 하면 된다.
#include <string>
#include <vector>
#include <map>
using namespace std;
long long solution(int n, vector<int> works) {
long long answer = 0;
map<int, int, greater<int>> m;// 작업량이 큰것들 먼저 해줘야 하기 때문에 내림차순 정렬
for (auto& work : works) {// 작업량 별 개수 저장
m[work]++;
}
for (auto& work : m) {
if (n == 0 || !work.first) break ;// 더 이상 작업 못하거나, 남은 작업이 없다면
int cnt = work.second < n ? work.second : n;
m[work.first-1] += cnt;// 작업량 - 1 의 개수 추가
work.second -= cnt;// 현재 작업량 에서 처리한 일만큼 개수를 빼준다.
n -= cnt;// 일한만큼 행동 빼주기
}
for (auto& work : m) {
answer += 1LL * work.second * work.first * work.first;
}
return answer;
}