ます、同じ人のタスクは連続して処理されるべき。
混ぜると、同じ時間の消費でも互いの終了時刻が後ろにずれてしまう。
どれから最初に処理すべきかというと、時間の総和が小さい順。
逆だと、同じ時間の消費でも終了時刻が後ろにずれてしまう。
同じ時間同士の場合は、1/2して期待値に足す。
どちらが先に行われるかは等確率なので、それより前の場合と後の場合になる。
同じ人のタスクの中での期待値も同様の理由から、1/2にして期待値に足す。
class BatchSystemRoulette { public: vector <double> expectedFinishTimes(vector <int> D, vector <string> U) { const int N = D.size(); map<string, lli> sum; vector<string> name; for (int i = 0; i < N; ++i) { name.push_back(U[i]); sum[U[i]] += D[i]; } sort(name.begin(), name.end()); name.erase(unique(name.begin(), name.end()), name.end()); vector<double> ret; for (int i = 0; i < N; ++i) { double prev = 0; double same = -sum[U[i]]; for (int j = 0; j < name.size(); ++j) { if (sum[name[j]] < sum[U[i]]) prev += sum[name[j]]; if (sum[name[j]] == sum[U[i]]) same += sum[name[j]]; } double e = D[i]; for (int j = 0; j < N; ++j) { if (i != j && U[i] == U[j]) e += 0.5 * D[j]; } ret.push_back(prev + e + same / 2.0); } return ret; } };