こんばんは。
2021/6/19に、AtCoderのABC-206に参加しました。
レートは以下の通りとなっています。
C問題まで突破し、順位は5887/9029でした。
レートは+8で231へ。久々にプラスで嬉しいけど、挽回までまだまだ時間がかかりそうです。
C問題で一度WAを出してしまっただけで、このレートかあ・・。
A問題
定価206円のエナジードリンクを1本N円で販売。
消費税率1.08を乗じたうえで、定価206円を上回るかどうか?
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long m = (n*108/100);
//System.out.println(n*108/100);
if(m<206){
System.out.println("Yay!");
}else{
if(m==206){
System.out.println("so-so");
}else{
System.out.println(":(");
}
}
}
}
B問題
空の貯金箱がある。
1日目に1円。2日目に2円、、と貯金していき、入力したN円に到達するのはいつか?
結構悩んでしまいました・・。
まず、x日間貯金を続けたときの金額は、
x*(x-1)/2
になります。今回は、これがN円になる時を考えます。すると、
2n = x^2
(-1は無視する事にしました)
で、xは、√2nになると考えました。
xが小数点以下を四捨五入して求める事で、ACとなりました。
ただ、四捨五入でなぜ良いのか、論理的な説明が自分でちょっと難しい状態です・・。
値を複数使ってテストをすると、上記のようになり、四捨五入すればよさそうなのでこのプログラムにしたのですが。
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
double n = sc.nextDouble();
double m = 2*n;
double c = Math.sqrt(m);
System.out.println(Math.round(c));
}
}
C問題
数列が与えられる。Ai≠AjかつAi<Ajとなる組み合わせはいくつあるか?
まず、1個ずつ比較するのはTLEになるのでだめですね。
・ソートする。これにより同じ値が隣同士にきて比較しやすくなる。
・同じ値があるか、その場合はいくつあるかチェックする。
同じ値がx個あったときは、x(x-1)/2個の組み合わせが上記の条件の対象外になる。
それを対象外カウンター(cnt)に加算していく。
・最後、N個の数列の全組み合わせの個数(n(n-1)/2)から、cntを減算する。
ここで、最初は配列の個数Nをint型で宣言し、最後まで使っていたところWAになりました。
考えてみたらNの値は3*10^5が限界ですが、最大値でn(n-1)/2の計算をしたときはint型の限界を超えてしまいますね。
最後、nをlong型にした変数nlを用意して計算するように修正しました。
import java.util.Scanner;
import java.util.Arrays;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long a[] = new long[n];
for(int i=0;i<n;i++){
a[i] = sc.nextLong();
}
Arrays.sort(a);
for(int i=0;i<n;i++){
// System.out.println(a[i]);
}
// chk
long cntwk =1;
long cnt =0;
char flg = '0';
for(int i=1;i<n;i++){
if(a[i-1]==a[i]){
cntwk++;
flg = '1';
}else{
cnt = cnt+(cntwk*(cntwk-1)/2);
cntwk=1;
//System.out.println(" i " + i + " cnt " + cnt);
flg = '0';
}
}
if(flg=='1'){
cnt = cnt+(cntwk*(cntwk-1)/2);
}
long nl = (long)n;
System.out.println(nl*(nl-1)/2-cnt);
}
}
さいごに
C問題は、過去の反省を踏まえずにWAを1度出してしまいました。
振り返り集をまとめておかないといけないですね。
今日は家の事情があり、真っ暗な部屋でパチパチ問題を解いていたので目が痛いです。
早く寝たいと思います。
最近は高いレートが出せないですが、ノーミスで少しでも早く解けるようにすれば、レートはまた上がると思うので、練習を少しずつ積んでいきます!