LoginSignup
0
0

More than 3 years have passed since last update.

【Java】AtCoderのABC-198に参加しました(レート:220→278)。

Last updated at Posted at 2021-04-11

こんばんは。

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

image.png

ひさびさなのでA、B問題に少し時間がかかってしまいました。
C問題は1ミスしましたが、何とか1時間程度で解けました。自分としては上出来です。
レートは221→278に更新!順位は3461/7993でした。

こないだマイナスになった分を取り返し、最高レートを更新です。
返り咲きおめ! \(^-^)/

A問題

N個のお菓子を、A君とB君で分ける組み合わせを求める。互いに1個以上あるのが前提。
色々考えて以下のプログラムにしましたが、お菓子の数-1を出力すればよいだけではないかと思われます。

例えばn=5(お菓子5個)の場合、A:4個、B:1個・・・A:1個、B4個、という順序で組み合わせを考えていくと、A君で見れば、4(n-1)~1 の4通りになる。という法則があるためです。
あれ?言葉で説明すると難しいな・・。

import java.util.Scanner;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  int na = 1;
  int nb = n-na;
  int cnt = 0;
  if(nb>0){
    cnt++;
  }
  while(nb>0){
    na++;
    nb = n - na;
    if(nb>0){
      cnt++;
    }
  }
  System.out.println(cnt);
}
}

B問題

整数Nに、0個以上の0を付与して回文にできるか?

例えば、1210であれば、1個の0を付与すれば、01210で、回文になります。
(しかし、よくこういう問題思いつくなあ・・)

<実装>
①まずは末尾のゼロの個数を数える(回文にするなら、付与するゼロの数と末尾のゼロの数は同じと断定)。
②末尾のゼロの個数と同じだけ、ゼロを付与した文字列を作成。
③③を逆転させた文字列を作成
④②③を比較

import java.util.Scanner;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  String n = sc.next();
  String ng = n;
  String nh[] = new String[n.length()];
  int zcnt = 0;
  String zer = "";
  // 0 no kazu check
  for(int i=n.length()-1;i>=0;i--){
     //System.out.println("n.charAt(i) = " + n.charAt(i));
     if(n.charAt(i)=='0'){
       zcnt++;
       zer = zer + "0";       
     }else{    
     break;
     }
  }
  ng = zer + ng;    
  //System.out.println(ng);
  String nkai = "";
  for(int i=ng.length()-1;i>=0;i--){
    nkai = nkai + String.valueOf(ng.charAt(i));
  }  
  //System.out.println(nkai);
  if(ng.equals(nkai)){
  System.out.println("Yes");
  }else{
  System.out.println("No");
  }

}
}

C問題

2次元平面上の原点(0,0)がスタート。1歩で進む距離はr。
座標(x,y)に行くには、最低何歩か?

<実装>
①原点から(x,y)への距離は、問題文の解説に従えば、
 √x^2 + y^2
 となる。まずこれを求める。

②1歩の進む距離(r)と、②を使って計算。
「②/r」の計算をすることに。
例えば距離が5だとして、rが2だったら、2.5歩だが、歩数は整数でないといけない。その場合は冗長な進み方(↓こんなやつ)をする事で整数の歩数で到達できる。

image.png

「②/r(小数点切り上げ)」を求める事で正解にたどり着けるのでは。
→これで提出したら3問エラーになる。いい線だが、まだ何か例外の考慮ができていないと考え悩む。

③「rが過剰な場合」の考慮ができていない事に気付く。
例えば、r=5で、行きたい座標が(1,1)のとき、②の計算では1になるが、1歩では座標を飛び越えてしまう。この場合は、1歩目と2歩目で距離を10にしつつ座標(1,1)に到達できるように調整する事ができると断定。この場合は必ず2歩で到達できる。
・・やっぱり文章にすると難しいけれど、以下のようなイメージ。

image.png

import java.util.Scanner;
public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  double r = sc.nextDouble();
  double x = sc.nextDouble();
  double y = sc.nextDouble();
  double xy = (x*x)+(y*y);
  //System.out.println((Math.sqrt(xy)));
  double hosu = ((Math.sqrt(xy)))/r;
  double hosuk = Math.ceil(hosu);
  //System.out.println(hosu);
  //System.out.println(hosuk);
  if(hosu>=1){
  System.out.println((int)hosuk);
  }else{
  System.out.println(2);
  }
}
}

感想

・今回はC問題が終わって残り40分あったため、D問題に取り組んでみたのですがやはり難しい。早くDに進めるレベルになりたいと思います。
・次は300を目指して頑張ります。他の方の記事を読むと、300以降が伸び悩むことも多いようです。心して取り組みたいと思います。

茶色を目指している方、お互い頑張りましょう!

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