TCHS SRM 54 Div1Easy ProblemSetter

問題文
難易度を示す正の整数列が与えられる。この数列から EasyとMediumとHard の問題を選びたい。EasyとMediumの難易度の差とMediumとHardの難易度の差とが出来るだけ近くなるように選べ。複数買いがある場合は、より簡単なEasy より難しいHard より簡単なMedium を持つものを選べ。

解法
pairに突っ込んでソートするだけ。C++11 の tuple を使おうとしたが pair のように operator が定義されいない模様。

#define F first
#define S second
#define ALL(c) (c).begin(), (c).end()
class ProblemSetter {
public:
  typedef pair<int, int> PII;
  typedef pair<int, PII> PIII;
  typedef pair<int, PIII> TUPLE;
  vector <int> chooseProblems(vector <int> D) {
    sort(ALL(D));
    vector<TUPLE> vec;
    for(int i=0; i<D.size(); i++)
      for(int j=i+1; j<D.size(); j++)
        for(int k=j+1; k<D.size(); k++)
          vec.push_back(TUPLE(abs((D[k]-D[j])-(D[j]-D[i])),
                              PIII(D[i],
                                   PII(-D[k],
                                       D[j]))));
    sort(ALL(vec));
    return {vec[0].S.F, vec[0].S.S.S, -vec[0].S.S.F};
  }
};