SRM 146 DIV2 Level One - ヤッツィー
TopCoderの過去問を解いていくよ。
ヤッツィーの簡単バージョン。
サイコロ5個振って出た目が
{4, 2, 2, 5, 4}
だったら、2が2個で4ポイント、4が2個で8ポイント、5が1個で5ポイント。
4が2個で8ポイントが一番高い得点なので、8ポイントを出力する。
max_elementを使ってみた版。
#include <vector> #include <algorithm> using namespace std; class Yahtzee { public : static int maxPoints(vector<int> toss) { vector<int> collects(6, 0); for (int i = 0; i < toss.size(); i++) collects[toss[i] - 1] += toss[i]; return *max_element(collects.begin(), collects.end()); } };
max_elementイイネ。
2回走査するのは無駄っぽいので、for一回で済ませる版。
後はイテレータマクロを用意してっと。
#include <vector> #include <algorithm> using namespace std; #define foreach(type ,bind, item) \ for (type::iterator bind = (item).begin(), __ie__ = (item).end() ;\ bind != __ie__ ; \ bind++) class Yahtzee { public : static int maxPoints(vector<int> toss) { int max_points = 0; vector<int> collects(6, 0); foreach (vector<int>, i, toss) max_points = max(collects[*i - 1] += *i, max_points); return max_points; } };
イイネ。
boostのFOR_EACHマクロがよさげ。Conditional Love: FOREACH Redux後で読むべ。