SRM 150 DIV2 Level One - 時計屋さん

問題の意味が全然わからなかったので、英文を紙に写経して、翻訳してから取り組んだ。ゆっくりでもいいからキッチリ理解して解いていきたい。英語克服すんぞー。


シミュレーション問題。


時計屋さんは一日に数個しか時計を直せない。繁盛している時は一日に直せる量を超えた注文がやってきてしまったり、注文がパッタリこなくなったり。

注文リストが与えられるから、何日でこなせるのか答えなさいと。ただし、注文の来なかった日はカウントしない。


{10, 0, 0, 4, 20}という注文リストがあって、一日に時計を直せる量は8個だったとする。

1日目に10個注文がやってきたから、8個直して、2個は次の日。3日目は注文無し。次の日は4つ。その次は大量にやってきて、8個、8個,4個とこなして、合計6日(注文の来なかった日はカウントしない)


っと。相当意訳。

#include <vector>
using namespace std;

#define foreach(type ,bind, item) \
    for (type::iterator bind = (item).begin(), __ie__ = (item).end() ;\
         bind != __ie__ ; \
         bind++)

class WidgetRepairs
{
    public:
        static int days(vector<int> arrivals, int numPerDay)
        {
            int count = 0;
            int works = 0;

            foreach (vector<int>, i, arrivals)
                if (works += *i, works != 0) {
                    count++;
                    works = (works < numPerDay) ? 0 : works - numPerDay;
                }

            count += works / numPerDay;
            if (works % numPerDay != 0)
                count++;

            return count;
        }
};

とりあえず溜まっちゃった仕事量を保存しておく作戦にしてみたけど、全然うまく書けないし。

英語は読めないし。

うまく書けた。

count += works / numPerDay + (works % numPerDay != 0);

完全に染まってるな。

もうちょい修正

破壊的Schemeっぽく。

#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 WidgetRepairs
{
    public:
        static int days(vector<int> arrivals, int numPerDay)
        {
            int count = 0;
            int works = 0;

            foreach (vector<int>, i, arrivals)
                count += (works += *i, works != 0) ? (works -= min(works, numPerDay),
                                                      1): 0;

            count += works / numPerDay + (works % numPerDay != 0);

            return count;
        }
};

minを使えば小さいほうを引く。と出来るな。