はじめに
今回はコンテスト中に書いたコードをDまでそのまま載せようと思います。
では、見ていきましょう。
A - Power
問題文はこちら
$1$に$A$を$B$回かければ良いと思ってそれを実装しました。
A.java
class Main{
static final boolean autoFlush = false;
static final Library System = new Library(java.lang.System.in,java.lang.System.out,java.lang.System.err,autoFlush);
public static void main(String[] args){
//A、Bの受け取り
int A = System.in.nextInt();
int B = System.in.nextInt();
//AをB回かける
int ans = 1;
while(B-->0){
ans *= A;
}
//出力
System.out.println(ans);
System.out.close();
}
}
問題は特にないですね(この制約なら(int)Math.pow(A,B)
でも大丈夫です)。
B - First Query Problem
問題文はこちら
純粋に配列で処理すれば良いと思ってそのまま実装しました。
B.java
class Main{
static final boolean autoFlush = false;
static final Library System = new Library(java.lang.System.in,java.lang.System.out,java.lang.System.err,autoFlush);
public static void main(String[] args){
//N、A、Qの受け取り
int N = System.in.nextInt();
int[] A = System.in.nextInt(N);
int Q = System.in.nextInt();
//Q回ループ
while(Q-->0){
//クエリの受け取り
int q = System.in.nextInt();
//1ならk番目(0-indexedなので-1する)をxに
if(q==1){
int k = System.in.nextInt();
int x = System.in.nextInt();
A[k-1] = x;
//2ならk番目(0-indexedなので-1する)を出力
}else{
int k = System.in.nextInt();
System.out.println(A[k-1]);
}
}
System.out.close();
}
}
これも比較的簡単でしたね。
C - Cash Register
問題文はこちら
先頭から順に見ていって、0
が連続したときに操作回数を加算しないようにすれば良いと思ってそのように実装しました。
C.java
class Main{
static final boolean autoFlush = false;
static final Library System = new Library(java.lang.System.in,java.lang.System.out,java.lang.System.err,autoFlush);
public static void main(String[] args){
//Sの受け取り
String S = System.in.next();
//一個前の入力操作(初期値はなんでも良い)
char before = '0';
//操作回数
int ans = 0;
//Sを先頭から見ていく
for(char c:S.toCharArray()){
//今0で一個前の操作も0なら00で置換する
if(c=='0'&&before=='0'){
before = 'a';
//それ以外はボタンを押す必要があるので押す
}else{
ans++;
before = c;
}
}
//操作回数の出力
System.out.println(ans);
System.out.close();
}
}
今思えば以下のように解くことも可能でしたね。
C改.java
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//Sの受け取り
String S = sc.next();
//00の部分をaに置換した時の文字列長を出力
System.out.println(S.replace("00","a").length());
}
}
Cにしては易しかったかな?
D - Scope
問題文はこちら
高橋君の操作の最後の「$S$の$j$番目から$i$番目までの文字からなる文字列が良い文字列となる最大の整数$j$を取る」は「$i$番目より左側で一番右側の(
の位置が$j$」と読み替えられるので
-
(
の時はArrayDequeにこれまで出てきた文字のHashSetを追加 - 文字が出てきたら今まで出てきたHashSetに追加(ここで、文字がすでに出てきてたらNo)
-
)
が出てきたら今の()
の中で出てきた文字を全体のHashSetから削除してArrayDequeから取り出す
という上記の行動を行なえば良いと考えて実装しました。
D.java
class Main{
static final boolean autoFlush = false;
static final Library System = new Library(java.lang.System.in,java.lang.System.out,java.lang.System.err,autoFlush);
public static void main(String[] args){
//Sの受け取り
String S = System.in.next();
//全体の出現管理
HashSet<Character> set = new HashSet<>();
//各()内で出現した文字列を管理するためのdeque
ArrayDeque<HashSet<Character>> list = new ArrayDeque<>();
//今の()内での出現管理
HashSet<Character> now = new HashSet<>();
//気絶しないでいけるか
boolean canSolve = true;
//なんとなく別変数に
int N = S.length();
//先頭から処理していく
for(int i=0;i<N;i++){
char c = S.charAt(i);
//'('ならdequeにaddして新しいsetに
if(c=='('){
list.add(now);
now = new HashSet<>();
}
//')'ならsetからnowのを削除し、nowをdequeから取り出した物に置き換える
else if(c==')'){
set.removeAll(now);
now = list.pollLast();
}
//文字ならsetとnowにadd(canSolveも更新)
else{
canSolve &= set.add(c);
if(!canSolve)
break;
now.add(c);
}
}
//気絶しないでできた?
System.out.println(canSolve?"Yes":"No");
System.out.close();
}
}
発想自体はスムーズにできたので良かったです。
感想
A,B;易しい
C:Cにしては易しい?
D:身構えたけど気付けばそんなに難しくはない
って感じでした。
Eが難しくて全然手も足もでませんでした・・・。圧倒的実力不足ッ・・・!