ABC051B - Sum of Three Integers

atcoder.jp

ABC085C - Otoshidama の類似問題。x と y が決まれば z も決まるので、2重ループで x と y を全探索すればいい。

using System;

namespace ABC051B
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = Console.ReadLine().Split(' ');
            var k = int.Parse(input[0]);
            var s = int.Parse(input[1]);

            var answer = 0;
            for (var x = 0; x <= k; x++)
            {
                for (var y = 0; y <= k; y++)
                {
                    var z = s - x - y;
                    if (z >= 0 && z <= k)
                    {
                        answer++;
                    }
                }
            }

            Console.WriteLine(answer);
        }
    }
}

ABC079C - Train Ticket

atcoder.jp

2 * 2 * 2 = 8 通りしかないので、総当たりで OK。今回は C# らしく LINQ で。クエリ式ならネスト深くならないし、途中の計算結果を let で保持できて、これはこれで便利。

using System;
using System.Linq;

namespace ABC079C
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = Console.ReadLine();
            var A = input[0] - '0';
            var B = input[1] - '0';
            var C = input[2] - '0';
            var D = input[3] - '0';

            var op = new[] { '+', '-' };
            var answer = (
                from op1 in op
                from op2 in op
                from op3 in op
                let AB = op1 == '+' ? A + B : A - B
                let ABC = op2 == '+' ? AB + C : AB - C
                let ABCD = op3 == '+' ? ABC + D : ABC - D
                where ABCD == 7
                select $"{A}{op1}{B}{op2}{C}{op3}{D}=7"
            ).FirstOrDefault();

            Console.WriteLine(answer);
        }
    }
}

ABC098C - Attention

atcoder.jp

西側から「自分より西にいるのに西を向いている人の数」を数える。 同時に、東側から「自分より東にいるのに東を向いている人の数」も数える。 最後に、「自分より西にいるのに西を向いている人の数」と「自分より東にいるのに東を向いている人の数」の最小値を計算すれば OK。 計算量は O(2N) かな。

using System;

namespace ABC098C
{
    class Program
    {
        static void Main(string[] args)
        {
            var N = int.Parse(Console.ReadLine());
            var S = Console.ReadLine();

            var W = new int[N];
            var E = new int[N];
            var wCount = 0;
            var eCount = 0;
            for (var i = 0; i < N; i++)
            {
                W[i] = wCount;
                if (S[i] == 'W')
                {
                    wCount++;
                }

                var j = N - i - 1;
                E[j] = eCount;
                if (S[j] == 'E')
                {
                    eCount++;
                }
            }

            var min = int.MaxValue;
            for (var i = 0; i < N; i++)
            {
                min = Math.Min(min, W[i] + E[i]);
            }
            Console.WriteLine(min);
        }
    }
}

ABC087C - Candies

atcoder.jp

N はたかだか 100 までだし、行数もたった 2 行なので、愚直な 2 重ループによる全探索で問題なく間に合う。一見ループは 1 つだけに見えるけど、LINQ を使っているので、やっていることは 2 重ループと同じ。

using System;
using System.Linq;

namespace ABC087C
{
    class Program
    {
        static void Main(string[] args)
        {
            var N = int.Parse(Console.ReadLine());
            var A1N = Console.ReadLine()
                .Split(' ')
                .Select(a => int.Parse(a))
                .ToList();
            var A2N = Console.ReadLine()
                .Split(' ')
                .Select(a => int.Parse(a))
                .ToList();
            var max = 0;
            for (var i = 0; i < N; i++)
            {
                var a1Total = A1N.Take(i + 1).Sum();
                var a2Total = A2N.Skip(i).Take(N - i).Sum();
                var total = a1Total + a2Total;
                max = Math.Max(max, total);
            }
            Console.WriteLine(max);
        }
    }
}

ABC065B - Trained?

atcoder.jp

ボタンを押したとき次に光るボタンの組を Dictionary<int, int> に詰めておき、押したボタンを Dictionary<int, int> から除いていく。 Dictionary<int, int> 中に無いボタンを押そうとしたら、それはすでに押されたボタンということになるので、ボタン2を光らせることは不可能と判断できる。

using System;
using System.Collections.Generic;

namespace ABC065B
{
    class Program
    {
        static void Main(string[] args)
        {
            var N = int.Parse(Console.ReadLine());
            var a = new Dictionary<int, int>();
            for(var i = 1; i <= N; i++)
            {
                a[i] = int.Parse(Console.ReadLine());
            }

            var btn = 1;
            var cnt = 0;
            while (true)
            {
                if (btn == 2)
                {
                    Console.WriteLine(cnt);
                    return;
                }
                else if (a.ContainsKey(btn))
                {
                    var next = a[btn];
                    a.Remove(btn);
                    btn = next;
                    cnt++;
                }
                else
                {
                    Console.WriteLine(-1);
                    return;
                }
            }
        }
    }
}

ABC060B - Choose Integers

atcoder.jp

逆転の発想。(B * i + C) % A == 0 を満たす i が存在するかどうかを調べる。 A で割った余りは記録しておき、同じ余りが出現したら、見つからないと判断して終了。

using System;
using System.Collections.Generic;

namespace ABC060B
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = Console.ReadLine().Split(' ');
            var a = int.Parse(input[0]);
            var b = int.Parse(input[1]);
            var c = int.Parse(input[2]);
            var memo = new HashSet<int>();

            for (var i = 0; ; i++)
            {
                var modA = (b * i + c) % a;
                if (modA == 0)
                {
                    Console.WriteLine("YES");
                    return;
                }
                if (memo.Contains(modA))
                {
                    Console.WriteLine("NO");
                    return;
                }
                memo.Add(modA);
            }
        }
    }
}

ABC048B - Between a and b ...

atcoder.jp

0 〜 b の範囲内で x で割り切れる値の個数から、0 〜 a-1 の範囲内中で x で割り切れる値の個数を差し引けばいい。ただ、a が 0 のときだけ特殊で、0 は x で割り切れるため +1 する。

using System;

namespace ABC048B
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = Console.ReadLine().Split(' ');
            var a = long.Parse(input[0]);
            var b = long.Parse(input[1]);
            var x = long.Parse(input[2]);
            if (a == 0)
            {
                // 0..b の範囲の中で x で割り切れる値の個数を求める。
                // 0 は x で割り切れるので +1 する。
                var answer = (b / x) + 1;
                Console.WriteLine(answer);
            }
            else
            {
                // 0..b の範囲の中で x で割り切れる値の個数から、
                // 0..(a-1) の範囲の中で x で割り切れる値の個数を引く。
                var answer = (b / x) - ((a - 1) / x);
                Console.WriteLine(answer);
            }
        }
    }
}