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}; } };