AtCoder参戦日記 ABC171 2020/11/07
緊張感と集中力を付けるために過去問もバーチャル参加しました。2020/11/07にバーチャル参加したABC171の記録です。
30分ほどで5完でした。5問目までは解法をほとんど考えることなく、コードを書いていただけでした。6問目が解法がわからず、すぐにあきらめちゃいました。
バーチャル参加はパフォーマンスが表示されないようなのですが、コンテストのランキングから、自分の得点と回答時間の近い人を探してパフォーマンスを推定しました。今回は1557でこれまでの最高値を出せました。スピード勝負に少し慣れてきた成果かもしれません。
問題 | 結果 | 言語 |
---|---|---|
A | AC | C++ |
B | AC | Scala (競技後にRuby, Java, C++) |
C | AC | Ruby |
D | AC | Java |
E | AC | 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 |
※結果欄は、時間内にAC取れた問題数とパフォーマンスです。パフォーマンスの括弧の数字はバーチャル参加の推定値です。
A - αlphabet
入力はアルファベットの大文字か小文字という前提を信じて、条件判定を手抜きしました。C++のコードです。
#include <bits/stdc++.h> using namespace std; int main() { string a; cin >> a; if (a[0] <= 'Z') { cout << "A\n"; } else { cout << "a\n"; } }
B - Mix Juice
sortやtakeを手早く書く方法が競技中はScalaしかわからなくてScalaになりました。Rubyも簡単にかけるんですね。
object Main extends App { val sc = new java.util.Scanner(System.in); val n, k = sc.nextInt(); val ps = Array.fill(n)(sc.nextInt()); val answer = ps.sorted.take(k).sum; println(answer); }
n, k = gets.strip.split(" ").map(&:to_i) ps = gets.strip.split(" ").map(&:to_i) puts(ps.sort.take(k).sum)
import java.util.Scanner; class Main { public static void main(String[] args) { var sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); var ps = new int[n]; for (int i = 0; i < n; i++) { ps[i] = sc.nextInt(); } java.util.Arrays.sort(ps); int sum = 0; for (int i = 0; i < k; i++) { sum += ps[i]; } System.out.println(sum); } }
#include <bits/stdc++.h> using namespace std; int main() { int n, k; cin >> n >> k; int *ps = new int[n]; for (int i = 0; i < n; i++) cin >> ps[i]; sort(ps, ps + n); int sum = 0; for (int i = 0; i < k; i++) sum += ps[i]; cout << sum << endl; }
C - One Quadrillion and One Dalmatians
競技中に書いたRubyのコードです。競技後に解説を見て、もっと簡単にできることがわかりました。
n = gets.strip.to_i - 1 l = 1 max0 = 26 max1 = 26 max2 = 0 while max1 <= n max2 = max1 l += 1 max0 *= 26 max1 += max0 end d = n - max2 answer = "" while l > 0 d1 = d / 26 d2 = d % 26 answer = (0x61 + d2).chr + answer d = d1 l -= 1 end puts(answer)
後日書いたより簡潔なコードです。
n = gets.strip.to_i - 1 answer = "" while true answer = (0x61 + (n % 26)).chr + answer n = n / 26 break if n == 0 n -= 1 end puts(answer)
D - Replacing
Javaです。この問題をScala/Java以外で解ける自信がなく。
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(); int q = sc.nextInt(); var bs = new int[q]; var cs = new int[q]; for (int i = 0; i < q; i++) { bs[i] = sc.nextInt(); cs[i] = sc.nextInt(); } var map = new java.util.HashMap<Integer, Integer>(); long sum = 0; for (int i = 0; i < n; i++) { int a = as[i]; sum += a; int count = map.getOrDefault(a, 0); map.put(a, count + 1); } for (int i = 0; i < q; i++) { int b = bs[i]; int c = cs[i]; int count = map.getOrDefault(b, 0); if (count > 0) { int count2 = map.getOrDefault(c, 0); map.put(b, 0); map.put(c, count + count2); sum += count * (c - b); } System.out.println(sum); } } }
E - Red Scarf
CやDよりも簡単な気がします。Javaです。
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(); int total = 0; for (int i = 0; i < n; i++) { total ^= as[i]; } for (int i = 0; i < n; i++) { if (i > 0) System.out.print(" "); System.out.print(as[i] ^ total); } System.out.println(); } }