- 基本的には、全ジョブの所要時間合計が少ないユーザのジョブから実行すれば良い。
- 但し、辞書式順で最小のものを返すために、次のようなソート処理を行った。
- 各ジョブ番号iに対して [user[i]の全ジョブの所要時間合計, user[i]が最初に出てくるジョブ番号, i(ジョブ番号自身)]という三つ組を作り、これらを左側の要素優先でソート。
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <utility>
#include <set>
#include <cctype>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iterator>
#include <stdexcept>
using namespace std;
class BatchSystem{
class MyComp{
public:
bool operator()(vector<long long> r, vector<long long> l){
int i;
for(i = 0; i < 3; i++){
if(r[i] != l[i]) break;
}
if(i == 3) return false;
return r[i] < l[i];
}
};
public:
vector <int> schedule(vector <int> duration, vector <string> user){
map<string, long long> jobTime;
map<string, int> firstPos;
int n = duration.size();
for(int i = 0; i < n; i++){
if(jobTime.find(user[i]) == jobTime.end()){
jobTime[user[i]] = 0;
firstPos[user[i]] = i;
}
jobTime[user[i]] += duration[i];
}
vector<vector<long long> > p(n, vector<long long>(3));
for(int i = 0; i < n; i++){
p[i][0] = jobTime[user[i]];
p[i][1] = firstPos[user[i]];
p[i][2] = i;
}
sort(p.begin(), p.end(), MyComp());
vector<int> ret;
for(int i = 0; i < n; i++){
ret.push_back(p[i][2]);
}
return ret;
}
};