こんばんは。
2021/4/11に、AtCoderのABC-198に参加しました。
レートは以下の通りとなっています。
ひさびさなので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歩だが、歩数は整数でないといけない。その場合は冗長な進み方(↓こんなやつ)をする事で整数の歩数で到達できる。
「②/r(小数点切り上げ)」を求める事で正解にたどり着けるのでは。
→これで提出したら3問エラーになる。いい線だが、まだ何か例外の考慮ができていないと考え悩む。
③「rが過剰な場合」の考慮ができていない事に気付く。
例えば、r=5で、行きたい座標が(1,1)のとき、②の計算では1になるが、1歩では座標を飛び越えてしまう。この場合は、1歩目と2歩目で距離を10にしつつ座標(1,1)に到達できるように調整する事ができると断定。この場合は必ず2歩で到達できる。
・・やっぱり文章にすると難しいけれど、以下のようなイメージ。
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以降が伸び悩むことも多いようです。心して取り組みたいと思います。
茶色を目指している方、お互い頑張りましょう!