競技プログラミングを行う際にいつも用いるものを纏めます。
型が異なる事による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点) | アルゴリズムロジック