C♯の勉強

C♯4.0 で TopCoder の過去問を解きます。

Div2Easy

TopCoder SRM614: MicroStrings

初 Writerした回。本問は非担当。再帰できる場合は再帰したほうがかっこいい。 public string makeMicroString(int A, int D) { if (A < 0) return ""; return A + makeMicroString(A - D, D); }

TopCoder SRM613: TaroString

'A','C','T'以外の文字を削除した後に、文字列が "CAT" になっているかを判定する。 public class TaroString { public string getAnswer(string S) { S = new String(S.Where(c => "CAT".Contains(c)).ToArray()); return S == "CAT" ? "Possible" : "Impos…

TopCoder SRM612: LeftAndRightHandedDiv2

S に含まれている "RL" を個数をカウントする。 public class LeftAndRightHandedDiv2 { public int count(string S) { return S.Zip(S.Skip(1), (c1, c2) => c1 == 'R' && c2 == 'L' ? 1 : 0).Sum(); } }

TopCoder SRM622: FibonacciDiv2

ある程度の数までフィボナッチ数を求めてから、差分の最小値を求める。 public class FibonacciDiv2 { public IEnumerable<int> GetFibonacci() { List<int> f = new List<int>(); f.Add(0); f.Add(1); while (true) { var x = f[f.Count - 2] + f[f.Count - 1]; if (x >= 1</int></int></int>…

TopCoder SRM610: DivideByZero

問題文通り実装するだけだけど、Div2 Easy にしてはやや複雑。 public class DivideByZero { public int CountNumbers(int[] numbers) { var newElements = ( from A in numbers from B in numbers let C = A / B where A > B && !numbers.Contains(C) selec…

TopCoder SRM617: SilverbachConjecture

探索しなくても、 n >= 20 より奇数と偶数で場合分けできる。(コード参照) public class SilverbachConjecture { public int[] solve(int n) { return (n % 2 == 0) ? new[] { 4, n - 4 } : new[] { 9, n - 9 }; } }

TopCoder SRM618: WritingWords

合計出すだけ。 public class WritingWords { public int write(string word) { return word.Sum(c => c - 'A' + 1); } }

TopCoder SRM619: GoodCompanyDivTwo

各 department について、重複 した work type がないかどうかを判定すればよい。 Div2 Easy にしては やや複雑な問題。 public class GoodCompanyDivTwo { public int countGood(int[] superior, int[] workType) { int n = superior.Length; int ans = 0; …

TopCoder SRM620: CandidatesSelectionEasy

問題文通りにソートする。OrderByは安定ソートのため、ThenBy(p => p.index0) は実は必要ない。 public class CandidatesSelectionEasy { public int[] sort(string[] score, int x) { return score .Select((s, index0) => new { s, index0 }) .OrderBy(p =…

TopCoder SRM611: InterestingNumber

xの中に '0' から '9'の文字について 0個か2個しか含まれてない 2個ある場合は、その間にある文字数とその文字が表す数字が等しい。 かどうかをチェックする。 public class InterestingNumber { public string isInteresting(string x) { for (int i = 0; i …

TopCoder SRM609: MagicalStringDiv2

左右に分割して、それぞれ文字を反転しなければならない箇所を数える。 public class MagicalStringDiv2 { public int minimalMoves(string S) { int n = S.Length; var left = S.Take(n / 2); var right = S.Skip(n / 2); return left.Count(c => c == '<')…

TopCoder SRM608: OneDimensionalRobotEasy

単純な実装問題。 public class OneDimensionalRobotEasy { public int finalPosition(string commands, int A, int B) { int pos = 0; foreach (var c in commands) { pos += (c == 'R') ? 1 : -1; if (pos < -A) pos = -A; if (pos > B) pos = B; } return…

TopCoder SRM607: BoundingBox

問題クラス名通り、Bounding Boxの面積を出せばよい。 public class BoundingBox { public int smallestArea(int[] X, int[] Y) { return (X.Max() - X.Min()) * (Y.Max() - Y.Min()); } }

TopCoder SRM605:AlienAndPassword

全通り試すだけ。 using E = System.Linq.Enumerable; public class AlienAndPassword { public int getNumber(string S) { return E.Range(0, S.Length).Select(i => S.Remove(i, 1)).Distinct().Count(); } }

TopCoder SRM606: EllysSubstringSorter

候補となる区間でのソートを全て試す。 public class EllysSubstringSorter { public string getMin(string S, int L) { int n = S.Length; string ans = ""; for (int i = 0; i + L - 1 < n; i++) { var array = S.ToCharArray(); Array.Sort(array, i, L);…

TopCoder SRM604: FoxAndWord

全探索。 public class FoxAndWord { public int howManyPairs(string[] words) { int n = words.Length; int ans = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { for (int k = 0; k < words[i].Length; k++) { if (words[i].Substring(…

TopCoder SRM603: MiddleCode

問題文にかかれている通りに実装するだけ。 public class MiddleCode { public string encode(string s) { if (s.Length == 0) return ""; int removePosition; if (s.Length % 2 == 1) { removePosition = s.Length / 2; } else { if (s[s.Length / 2 - 1] …

TopCoder SRM602: TypoCoderDiv2

色が変わる節目の個数を数える。 public class TypoCoderDiv2 { public int count(int[] rating) { int ans = 0; int current = 500; foreach (var r in rating) { if (current >= 1200 ^ r >= 1200) ans++; current = r; } return ans; } }

TopCoder SRM575: TheSwapsDivTwo

スワップの全パターンを試す。String.Join に String 以外の配列をそのまま渡しても問題ないようだ。 public class TheSwapsDivTwo { static public void Swap<T>(ref T a, ref T b) { T t = a; a = b; b = t; } public int find(int[] sequence) { int n = seq</t>…

TopCoder SRM601: WinterAndMandarins

bags をソートして、連続区間を全て試せば良い。 public class WinterAndMandarins { public int getNumber(int[] bags, int K) { if (bags.Length < K) return int.MaxValue; Array.Sort(bags); return Math.Min(bags.Take(K).Max() - bags.Take(K).Min(), …

TopCoder SRM599: MiniatureDachshund

体重 5kg を超えないように、みかんを軽い順に食べていきます。 public class MiniatureDachshund { public int maxMikan(int[] mikan, int weight) { Array.Sort(mikan); int cnt = 0; foreach (int m in mikan) { weight += m; if (weight <= 5000) cnt++;…

TopCoder SRM600: TheShuttles

シャトルの座席数で全探索。 public class TheShuttles { public int getLeastCost(int[] cnt, int baseCost, int seatCost) { int ans = int.MaxValue; for (int seat = 1; seat <= 100; seat++) { int need = 0; foreach (var c in cnt) { need += (c - 1)…

TopCoder SRM598: ErasingCharacters

s.Substring(0, i)+s.Substring(i + 2) とするより Remove 使ったほうが楽でした。 public class ErasingCharacters { public string simulate(string s) { for (int i = 0; i < s.Length - 1; i++) { if (s[i] == s[i + 1]) { return simulate(s.Remove(i, …

TopCoder SRM597: LittleElephantAndDouble

それぞれの要素について、2の倍数でなくなるまで2で割って、全ての要素が同じ値になるかどうかを判定する。 2進数文字列で変換 末尾の 0 を除去 全て同じ文字列になるかの判定 で実装してみた。 public class LittleElephantAndDouble { public string ge…

TopCoder SRM596: FoxAndSightseeing

先頭と末尾以外の要素についてスキップを試す。 public class FoxAndSightseeing { public int getMin(int[] position) { int n = position.Length; var candidate = Enumerable.Range(1, n - 2) .Select(i => position.Where((v, index) => index != i)) .T…

TopCoder SRM595: LittleElephantAndBallsAgain

全ての部分文字列を調べる。SubString の代わりに SkipとTakeを使うと配列外参照を気にしないで書ける。 public class LittleElephantAndBallsAgain { public int getNumber(string S) { return (from i in Enumerable.Range(0, S.Length) from j in Enumera…

TopCoder SRM577: EllysNewNickname

public class EllysNewNickname { public bool IsVowel(char c) { return "aeiouy".Contains(c); } public int getLength(string nickname) { return nickname.Length - nickname.Zip(nickname.Skip(1), (c1, c2) => IsVowel(c1) && IsVowel(c2) ? 1 : 0) .S…

TopCoder SRM594: FoxAndClassroom

実際にシミューレーションして判定をする。n と m が互いに素かどうかを判定してもよい。 public class FoxAndClassroom { public string ableTo(int n, int m) { HashSet memo = new HashSet(); int r = 0, c = 0; while (true) { r = (r + 1) % n; c = (c …

TopCoder SRM578: DeerInZooDivTwo

public class DeerInZooDivTwo { public int[] getminmax(int N, int K) { return new[]{ Math.Max(0, N-K), N - (K+1) / 2 }; } }

TopCoder SRM579: PrimalUnlicensedCreatures

弱い順に倒していけば良い。 public class PrimalUnlicensedCreatures { public int maxWins(int initialLevel, int[] grezPower) { Array.Sort(grezPower); int ans = 0; foreach (var power in grezPower) { if (initialLevel > power) { initialLevel += …