トップページに戻る    次の増井さんの書籍の問題へ    前の増井さんの書籍の問題へ

Q10 ルーレットの最大値


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] European ={0,32,15,19,4,21,2,25,17,34,6,27,13,
                         36,11,30,8,23,10,5,24,16,33,1,20,14,
                         31,9,22,18,29,7,28,12,35,3,26};

        int[] American ={0,28,9,26,30,11,7,20,32,17,5,22,34,
                         15,3,24,36,13,1,0,27,10,25,29,12,8,
                         19,31,18,6,21,33,16,4,23,35,14,2};

        int AnswerCnt = 0;
        for (int LoopN = 2; LoopN <= 36; LoopN++) {
            int MaxEuropean = DeriveMaxSum(European, LoopN);
            int MaxAmerican = DeriveMaxSum(American, LoopN);
            if (MaxEuropean < MaxAmerican) {
                AnswerCnt++;
                Console.WriteLine("N={0}のとき、ヨーロピアンでの最大={1}。アメリカンでの最大={2}",
                    LoopN, MaxEuropean, MaxAmerican);
            }
        }
        Console.WriteLine("答えは{0}", AnswerCnt);
    }

    //配列と連続した要素数を引数として、和の最大値を返す
    static int DeriveMaxSum(int[] pArr, int pN)
    {
        var SumSet = new HashSet<int>();
        int UB = pArr.GetUpperBound(0);
        for (int I = 0; I <= UB; I++) {
            int wkSum = 0;
            for (int J = I; J <= I + pN - 1; J++) {
                int CurrInd = J;
                if (UB < CurrInd) CurrInd -= UB + 1;
                wkSum += pArr[CurrInd];
            }
            SumSet.Add(wkSum);
        }
        return SumSet.Max();
    }
}


実行結果

N=2のとき、ヨーロピアンでの最大=51。アメリカンでの最大=60
N=4のとき、ヨーロピアンでの最大=90。アメリカンでの最大=93
N=6のとき、ヨーロピアンでの最大=133。アメリカンでの最大=134
N=10のとき、ヨーロピアンでの最大=207。アメリカンでの最大=208
N=12のとき、ヨーロピアンでの最大=240。アメリカンでの最大=241
N=14のとき、ヨーロピアンでの最大=276。アメリカンでの最大=282
N=16のとき、ヨーロピアンでの最大=318。アメリカンでの最大=319
N=17のとき、ヨーロピアンでの最大=328。アメリカンでの最大=332
N=35のとき、ヨーロピアンでの最大=651。アメリカンでの最大=652
答えは9


解説

始点と終点までをループさせて和を求めてます。