週末副業記

土日は副業エンジニアのブログです。副業に関することを投稿します。

競技プログラミング 個人的メモ【C#】


競技プログラミングを行う際にいつも用いるものを纏めます。
型が異なる事によるWAには要注意

読み込み、出力など

読み込み系

一行読みこむ(整数)
var n = int.Parse(Console.ReadLine());
複数文字列の一行を読みこむ(空白区切り、整数に変換)
var input = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
var input = Console.ReadLine().Split().Select(int.Parse).ToArray(); //こっちでも良い
複数文字列の複数行を読みこむ(空白区切り、整数に変換)
//Q行の入力あり  一行あたり3文字の入力あり それぞれ整数に変換して格納
int[,] LRT = new int[Q,3];
for(int i = 0; i < Q ; i ++){
      LRT[i,0] = int.Parse(Console.ReadLine());
      LRT[i,1] = int.Parse(Console.ReadLine());
      LRT[i,2] = int.Parse(Console.ReadLine());
}

出力系

resというint型の配列の中身を一行ずつ出力する。

Console.WriteLine(string.Join("\n",res.Skip(1)));
空白区切りで出力する
Console.WriteLine("{0} {1}",count_min,count_max);
改行せず出力する
Console.Write("S");
Console.Write("T");
//出力結果
//ST

比較系

2つの値の内、小さい方を採用する
Math.Min(A,B)
三項演算子
Console.WriteLine(answer ? "Yes" : "No");
指定の範囲の数字が入ったリストの作成
using System.Linq;
using System.Collections.Generic;
List<int> disclist = Enumerable.Range(1, nm[0]).ToList();
文字列の取得
string s = "sample";
s.Substring(0,3);
//samと出力  0:開始インデックス番号 3:インデックス番号か(含めた)文字数 
文字列を2桁0埋めで出力する
int a = 0;
string sa = a.ToString("D2");
Console.WriteLine(sa);//"00"と出力します

桁数系

切り上げ
Math.Ceiling(引数);

最大値

long.MaxValue

常駐関数(高速のため、常にこの関数を忍ばせる。随時追加)

    class ReadLine
    {
        public int[] GetInt(){int[] read = Array.ConvertAll(Console.ReadLine().Split(),int.Parse);return read;}
        public long[] Getlong(){long[] read = Array.ConvertAll(Console.ReadLine().Split(),long.Parse);return read;}
    }
  //呼び出し方(Main関数中で)
  var readLine = new ReadLine();
  long[] read = readLine.Getlong();

その他

アナグラム(競プロでは、元の文字列を文字列入れ替えた文字列かどうかの判定に用いる)
public static bool IsAnagramOf(string word1,string word2)
 {
     return word1.OrderBy(x=>x).SequenceEqual(word2.OrderBy(x=>x));
 }
最初の文字を大文字に、その他の文字を小文字にする

調べたらすぐに出てくるので書くまでもありませんが、、

using System;
using System.Globalization;

namespace _011b
{
    class Program
    {
        static void Main(string[] args)
        {
            string S = Console.ReadLine();
            TextInfo ti = System.Globalization.CultureInfo.CurrentCulture.TextInfo;
            Console.WriteLine(ti.ToTitleCase(S));
        }
    }
}
boolを用いて繰り返し出現を検出
//bool配列の配列番号を重複判定番号として、重複判定番号を配列番号として使用することで
//その番号の結果がtrueになっていると重複している。というように使うことができる。
bool[] tyouhukuFlag = new bool[N+1];
while(true){
       if(array_num == 2){
          break;
      }else if(tyouhukuFlag[array_num]){
          count = -1;
          break;
      }
}
素数判定をする
        public static bool IsPrime(long num)
        {
            if(num < 2)return false;
            else if(num == 2)return true;
            else if(num %2 == 0)return false;

            double sqrtNum = Math.Sqrt(num);
            for(int i = 3; i <= sqrtNum; i++){
                if(num % i == 0){
                    return false;
                }
            }
            return true;
        }
各桁の和をとる
        public static long digit_sum(long n)
        {
            if(n < 10) return n;
            return digit_sum(n/10)+n%10;
        }

その他URL

経路長の平均問題

数式の導出も書いてあるため、わかりやすいです。
【AtCoder Beginner Contest 145】C – Average Length (300点) | アルゴリズムロジック

配列の中の一致要素数を数える時にLinq.Countは使わない

別のやり方があれば、for文使用する方が速いです。(今まで)