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

コンテスト的なの参加してみたいけどとりあえず直近の過去問を漁る

https://atcoder.jp/contests/abc356

## [A -Subsegment Reverse](https://atcoder.jp/contests/abc356/tasks/abc356_a)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817552/b7fd8ddf-d4a4-2d54-bf39-832e54821cb8.png)



### コメント

問題自体は簡単だがなんだか回りくどいことしてしまった．まだまだ頭固い．
```C#
using System;
using System.Linq;
class Program
{

    static void Main(String[] args)
    {
        string[] input = Console.ReadLine().Split(' ');
        int N = int.Parse(input[0]);
        int L = int.Parse(input[1]);
        int R = int.Parse(input[2]);

        int[] num1 = new int[N+1];
        int[] num2 = new int[N+1];
        for (int i = 0; i <= N; i++) num1[i] = i;
        for (int i = 0; i <= N; i++) num2[i] = 0;

        for (int i = 1; i <= R - L + 1; i++)
        {
            num2[i + L - 1] = num1[R - i + 1];
        }

        for (int i = 1; i <= N; i++)
        {
            if(i<L | R < i)
            {
                Console.Write(num1[i] + " ");
            }
            else
            {
                Console.Write(num2[i] + " ");
            }
                
        }
        
    }
}
```
## [B -Nutrients](https://atcoder.jp/contests/abc356/tasks/abc356_b)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817552/807f09eb-7c23-015b-8c34-e9f0e099b1ca.png)

### コメント

各項目の目標値Aから摂取量Xを引き続けて全部0以下だったらOKとした．
```C#
using System;
using System.Linq;
class Program
{

    static void Main(String[] args)
    {
        string[] input = Console.ReadLine().Split(' ');
        int N = int.Parse(input[0]);
        int M = int.Parse(input[1]);

        int[] A = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

        for (int i = 1; i <= N; i++)
        {
            int[] X = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

            for(int j = 0; j < M; j++)
            {
                A[j] -= X[j];
            }

        }

        bool check = true;

        for(int i = 0; i < M; i++)
        {
            if (A[i] > 0)
            {
                check = false;
                break;
            }
        }

        if (check) Console.WriteLine("Yes");
        else Console.WriteLine("No");

    }
}
```

## [C -Keys](https://atcoder.jp/contests/abc356/tasks/abc356_c)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817552/d119e433-c393-db16-afc3-ea43723149e7.png)



### コメント

初心者には難しい問題だった．．．まず正しい鍵かどうかの組み合わせは0と1の数字に置き換えることができそうという発想まではたどり着いたけど実装の仕方が分からないので検索．bit全探索の理解からスタート．あとは鍵の組み合わせ2^N通りについてM回テストするだけかな？結構時間かかった．．．
```C#
using System;
using System.Linq;
class Program
{

    static void Main(String[] args)
    {
        string[] input = Console.ReadLine().Split(' ');
        int N = int.Parse(input[0]);
        int M = int.Parse(input[1]);
        int K = int.Parse(input[2]);
        int ans = 0;
        int[,] A = new int[110, 20];
        string[] R = new string[110];

        for (int i = 1; i <= M; i++)
        {

            string[] row = Console.ReadLine().Split(' ');
            for (int j = 0; j <= int.Parse(row[0]); j++)
            {
                A[i, j] = int.Parse(row[j]);
            }

            R[i] = row[int.Parse(row[0]) + 1];

        }


        for (int i = 0; i < Math.Pow(2, N); i++)
        {
            bool[] key = new bool[20];
            for (int j = 0; j < N; j++) key[j] = false;

            bool check = true;

            for (int j = 0; j < N; j++)
            {
                int keyCheck = (i >> j) & 1;
                if (keyCheck == 1) key[j] = true;
            }

            for (int j = 1; j <= M; j++)
            {
                int keySum = 0;
                for (int k = 1; k <= A[j, 0]; k++)
                {
                    if (key[A[j, k] - 1]) keySum++;
                }


                if ((keySum >= K & R[j] == "x") | (keySum < K & R[j] == "o")) check = false;

            }

            if (check)
            {
                ans++;
            }

        }

        Console.WriteLine(ans);

    }
}
```
わたしはここで力尽きた