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);
}

後日、Ruby, Java, C++でも書きました。

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();
  }
}