0
0

More than 3 years have passed since last update.

【Java】AtCoderのABC-206に参加しました(レート:223→231)。

Posted at

こんばんは。

2021/6/19に、AtCoderのABC-206に参加しました。
レートは以下の通りとなっています。

image.png

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となりました。
ただ、四捨五入でなぜ良いのか、論理的な説明が自分でちょっと難しい状態です・・。

image.png

値を複数使ってテストをすると、上記のようになり、四捨五入すればよさそうなのでこのプログラムにしたのですが。

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度出してしまいました。
振り返り集をまとめておかないといけないですね。

今日は家の事情があり、真っ暗な部屋でパチパチ問題を解いていたので目が痛いです。
早く寝たいと思います。

最近は高いレートが出せないですが、ノーミスで少しでも早く解けるようにすれば、レートはまた上がると思うので、練習を少しずつ積んでいきます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0