こんばんは。
2021/5/22に、AtCoderのABC-202に参加しました。
レートは以下の通りとなっています。
C問題まで突破しました。
ただ、B問題が一度TLE、C問題は試行錯誤してしまったのと操作ミスで3回エラーになってしまい減点もあった模様です。
レートは272→277にアップ。しょぼいですね。最高レート(278)を次回は更新したい。
A問題
さいころを3つ振る。
出た目の裏側の数を合計する。
おお、これは簡単だと思い、すぐ解けました。
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
System.out.println((7-a)+(7-b)+(7-c));
}
}
B問題
0,1,6,8,9からなる文字列を、180度回転させた文字列を答える。
つまり6は9になったり、0は0のままだったりし、かつ文字列が逆になります。
ここで、文字列を1つずつif文で判定するロジックにしたところ、TLEになりました。痛恨のミスですね。case文の文法を度忘れしてしまったので・・。
文法、調べなおして書きました。
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String s = sc.next();
String scn = "";
for (int i=0;i<s.length();i++){
switch(s.charAt(i)){
case '0':
scn = "0" + scn;
break;
case '1':
scn = "1" + scn;
break;
case '6':
scn = "9" + scn;
break;
case '8':
scn = "8" + scn;
break;
case '9':
scn = "6" + scn;
break;
}
}
System.out.println(scn);
}
}
C問題
Nこの文字列A,B,Cがある。
Ai=Bcjとなる組み合わせを求める。
Aiを読み込み、一個ずつ調べるとTLEになってしまいます。
そこで、値読み込みの時にこのような処理を入れました。
1~N*2の2次元テーブルを用意する。
N=3の時はこんな感じです。
これは、読み込んだ値がいくつあるかを数えています。
N 3
A 1 2 2
B 3 1 2
C 2 3 2
例えばこんな入力例の場合、こうなります。
Aは、1が1個、2が2個。
Cでいうと、
c[0]は2、b[2-1]は1なので、1つ目の配列に1加算。
c[1]は3、b[3-1]は2なので、2つ目の配列に1加算
c[2]は2、b[2-1]は1なので、1つ目の配列に1加算
こうやっていくと、この配列を順次読み込み、A*Bを加算していくと組み合わせの数が求められると考えました。
こんなプログラムです。
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long a[] = new long[n];
long b[] = new long[n];
long c[] = new long[n];
long hai[][] = new long[n][2];
for (int i=0;i<n;i++){
a[i] = sc.nextInt();
hai[(int)(a[i]-1)][0] = hai[(int)(a[i]-1)][0] + 1;
}
for (int i=0;i<n;i++){
b[i] = sc.nextInt();
}
for (int i=0;i<n;i++){
c[i] = sc.nextInt();
//System.out.println(i);
hai[(int)(b[(int)(c[i]-1)]-1)][1] = hai[(int)(b[(int)(c[i]-1)]-1)][1] + 1;
}
long cnt = 0;
for (int i=0;i<n;i++){
cnt = cnt + hai[i][0]*hai[i][1];
}
System.out.println(cnt);
}
}
最後に
・エラーが出たときは、値の範囲を超過していないかを確認する。
C問題ではNの範囲が10^5だったので油断し、int型を使ってしまいました。long型でないとだめですね。
・焦らない。
c問題の回答を、A問題を選択してエラーという痛恨のミス。気を付けます。
パフォーマンスはいまいちでしたが久々にC問題まで解けていい気分です。最近何をやってもさえないですが、引き続き頑張ります。