AtCoder参戦日記 ABC182 2020/11/08 #8
AtCoderの8回目の参加となった2020/11/08のABC182の記録です。
25分ほどで4完でした。5問目は少し考えて計算量を抑える方法を思いつかずあきらめました。6問目は解法がわからないままタイムアップでした。
そろそろ後半の難しい問題も解けるようにならないと伸び悩みそうです。
問題 | 結果 | 言語 | 競技後 |
---|---|---|---|
A | AC | Ruby | Elixir |
B | AC | Scala | Python, Ruby |
C | AC | Scala | |
D | AC | Java | |
E | Java | ||
F |
過去の参戦記録
参加日 | コンテスト名 | 結果 | 使用言語 |
---|---|---|---|
2020/08/29 #1 | ABC177 | 3完 / 614 | Scala, Scala, Java |
2020/09/13 #2 | ABC178 | 5完 / 1466 | Python, Scala, Scala, C++, Scala |
2020/09/19 #3 | ABC179 | 3完 / 1004 | Java, Scala, Scala |
2020/10/03 #4 | ARC104 | 2完 / 1067 | Python, Scala |
2020/10/10 #5 | HHKB2020 | 3完 / 902 | C++, Scala, Java |
2020/10/11 #6 | ARC105 | 2完 / 1069 | Ruby, Java |
2020/11/01 | ABC180 | 4完 / (937) | Ruby, Scala, C++, Java |
2020/11/01 #7 | ABC181 | 4完 / 1136 | C++, Scala, Java, Java |
2020/11/07 | ABC171 | 5完 / (1557) | C++, Scala, Ruby, Java, Java |
2020/11/08 #8 | ABC182 | 4完 / 1072 | Ruby, Scala, Scala, Java |
※結果欄は、時間内にAC取れた問題数とパフォーマンスです。パフォーマンスの括弧の数字はバーチャル参加の推定値です。
A - twiblr
1問目は言語の練習として私の馴染みの薄いRubyで書きました。
a, b = gets.strip.split(" ").map(&:to_i) puts(a * 2 + 100 - b)
後日Elixirでも書きました。
defmodule Main do def main do [a, b] = IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1) IO.puts(a * 2 + 100 - b) end end
B - Almost GCD
手早く書くことを優先してScalaで書きました。
object Main extends App { val sc = new java.util.Scanner(System.in); val n = sc.nextInt(); val as = Array.fill(n)(sc.nextInt()); val max = as.max; var gcd: Int = 0; var answer: Int = 0; (2 to max).foreach { i => val c = as.count(_ % i == 0); if (c > gcd) { gcd = c; answer = i; } } println(answer); }
n = int(input()) ass = list(map(int, input().split(" "))) gcd = 0 answer = 0 for i in range(2, max(ass)+1): c = 0 for j in ass: if j % i == 0: c += 1 if c > gcd: gcd = c answer = i print(answer)
n = gets.strip.to_i as = gets.strip.split(" ").map(&:to_i) gcd = 0 answer = 0 for i in 2..as.max c = 0 for j in as c+=1 if j % i == 0 end if c > gcd gcd = c answer = i end end puts(answer)
C - To 3
手早く書くことを優先してScalaで書きました。
object Main extends App { val sc = new java.util.Scanner(System.in); val n = sc.nextLong(); val set = n.toString.map {ch: Char => (ch - '0') % 3}; val count1 = set.count(_ == 1); val count2 = set.count(_ == 2); val sum = set.sum % 3; sum match { case 0 => println(0); case 1 => if (count1 >= 1 && set.size > 1) { println(1); } else if (count2 >= 2 && set.size > 2) { println(2); } else { println(-1); } case 2 => if (count2 >= 1 && set.size > 1) { println(1); } else if (count1 >= 2 && set.size > 2) { println(2); } else { println(-1); } } }
D - Wandering
Javaになりました。Scalaにしなかったのは、関数型ではなく、変数に代入しながら処理する手続き的なやりかたが考えやすかったためです。
import java.util.Scanner; class Main { public static void main(String[] args) { var sc = new Scanner(System.in); int n = sc.nextInt(); var as = new int[n]; for (int i = 0; i < n; i++) { as[i] = sc.nextInt(); } long pos = 0L; long sum = 0L; long max1 = 0L; long max2 = 0L; for (int i = 0; i < n; i++) { sum += as[i]; if (sum > max1) max1 = sum; long p = pos + max1; pos += sum; if (p > max2) max2 = p; } System.out.println(max2); } }
E - Akari
競技中は、少し考えて計算量を抑える方法を思いつかずあきらめました。
以下は後日解説を読んでから書いたJavaのコードです。
import java.util.Scanner; class Main { public static void main(String[] args) { var sc = new Scanner(System.in); int h = sc.nextInt(); int w = sc.nextInt(); int n = sc.nextInt(); int m = sc.nextInt(); int hw = h * w; var table = new int[hw]; var as = new int[n]; var bs = new int[n]; for (int i = 0; i < n; i++) { // 電球 int a = sc.nextInt()-1; int b = sc.nextInt()-1; as[i] = a; bs[i] = b; } for (int i = 0; i < m; i++) { // ブロック int c = sc.nextInt()-1; int d = sc.nextInt()-1; table[w*c+d] = 8; } for (int i = 0; i < n; i++) { int a = as[i]; int b = bs[i]; int g = w*a+b; if ((table[g] & 0x1) == 0) { int k = g; for (int b2 = b-1; b2 >= 0; b2--) { k--; if (table[k] == 8) break; table[k] |= 0x1; } k = g; for (int b2 = b+1; b2 < w; b2++) { k++; if (table[k] == 8) break; table[k] |= 0x1; } } if ((table[g] & 0x2) == 0) { int k = g; for (int a2 = a-1; a2 >= 0; a2--) { k-=w; if (table[k] == 8) break; table[k] |= 0x2; } k = g; for (int a2 = a+1; a2 < h; a2++) { k+=w; if (table[k] == 8) break; table[k] |= 0x2; } } table[g] |= 0x3; } int answer = 0; for (int i = 0; i < hw; i++) { if ((table[i] & 0x3) != 0) answer++; } System.out.println(answer); } }