AtCoderをC#で始めてみたよ　-AtCoder Beginner Contest 359-

コンテストに初めて参加してみたので結果を書いていく，前回のやつは[こちら](https://qiita.com/YamayouOmiya/items/ee755a8f09d08bfc452e)

https://atcoder.jp/contests/abc359

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817552/9a50a815-43fd-2ba7-dff9-ff90072ae40e.png)
3完，4543位，とりあえずギリギリでCまで出せたけどCが時間かかりすぎた．まあ初回なのでとりあえずOKとします．次はDまで解けるようにしたい


## [A - Count Takahashi](https://atcoder.jp/contests/abc359/tasks/abc359_a)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817552/f53b56de-0550-e104-0307-803b4a776bc2.png)


### コメント

タカハシかどうかを判定するためにfor文を回すだけ，easy
```C#
using System;
using System.Collections.Generic;

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

        for(int i = 0; i < N; i++)
        {
            S[i] = Console.ReadLine();
        }

        int countTakashi = 0;

        for(int i = 0; i < N; i++)
        {
            if (S[i] == "Takahashi")
            {
                countTakashi++;
            }
        }

        Console.WriteLine(countTakashi);


    }
}

```
## [B - Couples](https://atcoder.jp/contests/abc358/tasks/abc359_b)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817552/3c6b258a-4486-a583-ba31-e8c340cf38c7.png)



### コメント
1回目と2回目に各数字が表れる番号を記録して差が2になったものをカウントしていった．解説みたらiとi+2番目の数が一致したものをカウントしていて，「あ，たしかにそっちの方が簡単だね」ってなった．
```C#
using System;
using System.Linq;
class Program
{

    static void Main(String[] args)
    {
        int N = int.Parse(Console.ReadLine());
        int[] A = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

        int count = 0;

        for (int i = 1; i <= N; i++)
        {
            int firstN = 0;
            int SecoundN = 0;
            for (int j = 0; j < 2 * N; j++)
            {
                if (A[j] == i)
                {
                    firstN = j;
                    break;
                }
            }

            for (int j = firstN + 1; j < 2 * N; j++)
            {
                if (A[j] == i)
                {
                    SecoundN = j;
                    break;
                }
            }

            if (SecoundN - firstN == 2) count++;

        }

        Console.WriteLine(count);
        

    }
}
```

## [C - Tile Distance 2](https://atcoder.jp/contests/abc358/tasks/abc359_c)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817552/9ef16f90-47ae-d5e3-3c4c-6f537eb96ba8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817552/0ede6c62-25ba-5270-1af1-78868d9096f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817552/28edb79e-b21b-bf47-8aa4-7c2b93e1d26a.png)



### コメント

BからCって急に難易度上がるよな．．．まさか1時間以上かかるとは．とりあえずタイルの中で右にいるか左にいるかは問題に関係ないとわかったのでx,yの偶奇で場合分けしてタイルの代表値（今回はタイル下部の中心点とした）を取得していく．y方向の差は必ず通行料を払わないといけないのでansに代入．あとはx方向の処理を考えるのにかなりの時間を要した．．．解説見たらすごいすっきりした式で書いてあって驚いた．

```C#
using System;
using System.Linq;
class Program
{
    static bool RightOrLeft(long[] point)
    {
        return (point[0] % 2 == 0 & point[1] % 2 == 1) | (point[0] % 2 == 1 & point[1] % 2 == 0);
    }

    static void Main(string[] args)
    {
        long[] S = Console.ReadLine().Split(' ').Select(long.Parse).ToArray();
        long[] T = Console.ReadLine().Split(' ').Select(long.Parse).ToArray();

        long[] startTile = new long[2];
        long[] goalTile = new long[2];

        if (RightOrLeft(S))
        {
            startTile[0] = S[0];
            startTile[1] = S[1];
        }
        else
        {
            startTile[0] = S[0] + 1;
            startTile[1] = S[1];
        }

        if (RightOrLeft(T))
        {
            goalTile[0] = T[0];
            goalTile[1] = T[1];
        }
        else
        {
            goalTile[0] = T[0] + 1;
            goalTile[1] = T[1];
        }

        long ans = 0;
        ans += Math.Abs(goalTile[1] - startTile[1]);

        long horizontalDifference = goalTile[0] - startTile[0];
        long verticalDifference = goalTile[1] - startTile[1];

        if (horizontalDifference % 2 == 0)
        {
            ans += Math.Max(0, Math.Abs(horizontalDifference) / 2 - Math.Abs(verticalDifference) / 2);
        }
        else
        {
            ans += Math.Max(0, (Math.Abs(horizontalDifference) + 1) / 2 - (Math.Abs(verticalDifference) + 1) / 2);
        }

        Console.WriteLine(ans);
    }
}
```
D以降はまた今度かな．．．