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後で読むべ。

今更気づいたこと

Cばっかりだったから、全然気付かなかった。


forの宣言部は一個の型しか書けない

for (int i = 0, double d = 0; ...) // エラー

一般の文に直すと

int i = 0, double d = 0; // 出来ない

うは、forってホント使えねー。

再帰いいよ再帰