【Java】AtCoderのABC-198に参加しました（レート：220→278）。

こんばんは。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/b62e4a71-ab07-19d9-1dfd-8afaca6ed08c.png)


https://atcoder.jp/users/ishikawaryou

ひさびさなので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通りになる。という法則があるためです。
あれ？言葉で説明すると難しいな・・。

```java
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で、回文になります。
（しかし、よくこういう問題思いつくなあ・・）


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


```java
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/d1d5c024-07a9-2d15-9b08-4dc35da4260d.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/1b8390c0-3920-3fe1-7dd8-e18bb83abaa0.png)


```java
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以降が伸び悩むことも多いようです。心して取り組みたいと思います。

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