競プロをしながら、節約と株式投資でセミリタイアを目指す東大卒のブログ

東大卒でメーカー勤務の私がセミリタイアするために投資や競プロを頑張っていこうという趣旨で始めたブログです。独身男性です。火木土日に更新予定です。お金について考えています。

ABC151で書いたコード

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

namespace Atcoder20190616
{
    class ProgramA
    {
        static void Main(string args)
        {
            //日付を入力する
            string input = Console.ReadLine();
            int n = input[0];//文字をint型で代入する

            n++;//int型で1足すことでアルファベットが1進む。
            
            //char型にして答を出す
            Console.WriteLine((char)(n));
            
        }
    }

    class ProgramB
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int  n = int.Parse(input[0]);
            int  k = int.Parse(input[1]);
            int  m = int.Parse(input[2]);
            string input_a = Console.ReadLine().Split(' ');
            int a = new int[n -1];
            int sum = 0;


            //今までの点をすべて足す
            for(int i = 0;i < n -1;i++)
            {
                a[i] = int.Parse(input_a[i]);
                sum += a[i];
            }


            //必要な点数と今までのままでの点数の差から判断する
            if(m*n - sum > k)//最後に取れる点より必要な点がおおきいときはあり得ない
            {
                Console.WriteLine("-1");
            }
            else if(m*n - sum <= 0)//最後に点を取らなくていいのはすでに必要な点数とれているとき
            {
                Console.WriteLine("0");
            }
            else//それ以外は必要な点数を出す
            {
               Console.WriteLine(m*n - sum); 
            }
    
        }
    }

    class ProgramC
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int m = int.Parse(input[1]);
            int right = new int[n];
            int wrong = new int[n];


            //それぞれを判定する
            for(int i = 0;i < m;i++)
            {
                string temp = Console.ReadLine().Split(' ');
                int p = int.Parse(temp[0]);
                string s = temp[1];


                //すでにACしているなら無視する
                if(right[p-1] == 1)
                    continue;
                
                if(s == "WA")
                {
                    wrong[p-1]++;//間違い数をカウント
                }
                else
                {
                    right[p-1] = 1;//ACしたら1にする。
                }
            }

            int ans1 = 0;
            int ans2 = 0;
            for(int i = 0;i < ni++)
            {
                //正しい答えの数を足す
                ans1 += right[i];
                //もしその問題が答えならWAの数を計上する
                if(right[i] == 1)
                   ans2 += wrong[i];

            }

            //答えを出力
            Console.WriteLine(ans1 + " " + ans2);
          
        } 
    }

    class ProgramD
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int H = int.Parse(input[0]);
            int W = int.Parse(input[1]);
            int INF = 1000000;


            //ワーシャルフロイド法の準備。すべてとりあえず#とする。(そうするとこのあと.だけの判定で済む)
            int[ , ] dis = new int[H*W + 1,H*W + 1];
            for(int i = 0;i < H*W;i++)
                for(int j = 0;j < H*W;j++)
                {
                    if(i == j)
                      dis[i,j] = 0;
                    else
                      dis[i,j] = INF;
                }


            //前の迷路状態を記録して置くためにmaze2を作成。
            string maze2 = "####################";
 
            for(int i = 0;i < H;i++)
            {
                //迷路を読み込む
                string maze = Console.ReadLine();
                
                for(int j = 0;j < W;j++)
                {
                    //横のつながりを判定する。つながっていれば1を代入
                    if(j > 0 && maze[j - 1] == '.' && maze[j] == '.')
                    {
                        dis[i*W + ji*W + j - 1] = 1;
                        dis[i*W + j-1i*W + j] = 1;
                    }

                    //縦のつながりを判定する。ひとつ上と判定します。
                    if(i > 0 && maze2[j] == '.' && maze[j] == '.')
                    {
                        dis[i*W + j, (i-1)*W + j] = 1;
                        dis[(i-1)*W + ji*W + j] = 1;
                    }
                    
                     
                }
                
                //メイズを記録する
                maze2 = maze;
                
            }


            //ワーシャルフロイド法を用いる
            for (int k = 0k < H*Wk++)       // 経由する頂点
                for (int i = 0i < H*Wi++)     // 始点
                    for (int j = 0j < H*Wj++)   // 終点
                        dis[i,j] = min(dis[i,j], dis[i,k] + dis[k,j]);

            int ans = 0;


            //最大の経路を算出する
            for(int i = 0;i < H*W;i++)
                for(int j = 0;j < H*W;j++)
                {
                    if(dis[i,j] <= INF)
                    {
                        int temp = dis[i,j];
                        if(ans < temp)
                            ans = temp;

                    }
                }
            
            //答を出す
            Console.WriteLine(ans);
        
        }
        
    }
         
}