質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

216閲覧

AtCoder Beginner Contest115 D - Christmasがわからない

Moai101

総合スコア20

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/12/28 09:30

以下のコードのpati関数が何をしているのかがいまいち理解できません。
例えば、
else if(x<=1+layer[n-1])return pati(n-1,x-1);
とありますが、ここでの返り値はどのような演算を行なっているのでしょうか?

import java.util.*; public class Main { static long[] layer; public static void main(String args[]){ Scanner sc= new Scanner (System.in); int n = sc.nextInt(); long x = sc.nextLong(); layer=new long [n]; for(int i=0;i<n;i++){ if(i==0)layer[i]=1; else layer[i]=layer[i-1]*2+3; } long ans = pati(n,x); System.out.println(ans); } public static long pati(int n, long x){ if(n==0)return 1; else if(x<=1)return 0; else if(x<=1+layer[n-1])return pati(n-1,x-1); else if(layer[n-1]+2==x)return pati(n-1,x-2)+1; else if(x<2*layer[n-1]+2)return pati(n-1,layer[n-1])+1+pati(n-1,x-1-layer[n-1]-1); else return 2*pati(n-1,layer[n-1])+1; } }

参考にしたコードのリンクはこちらです
https://atcoder.jp/contests/abc115/submissions/3770935

問題のリンクはこちらです
https://atcoder.jp/contests/abc115/tasks/abc115_d

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

else if(x<=1+layer[n-1])return pati(n-1,x-1);

レベルnを下からx枚食べた時のpati数は、
x <= 1 + レベル(n-1)の枚数であれば
レベル(n-1)を下から(x-1)枚食べた時のpati数として計算できる

これ絵を書きながらやると分かりやすいですよ

投稿2018/12/28 10:12

set0gut1

総合スコア2413

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Moai101

2018/12/28 14:06 編集

返信ありがとうございます! 「レベル(n-1)を下から(x-1)枚食べた時のpati数として計算できる」とのことですが、具体的に私が載せたコードのどの部分で計算しているか教えていただけませんでしょうか? 例えば、 if(n==0)return 1; の部分ですと、実際に1という数字が返り値として返されてるので理解できます。しかし、返り値が関数だと、どこでどのように計算されて、出力されるのかが掴みきれていないところです。
set0gut1

2018/12/28 14:33 編集

pati(n-1,x-1) は関数ではなく、関数を実行した結果の long 型の値です。(関数 pati 自体を返すようなコードも存在するので念のため) pati 内で pati を呼び出すような実装を再帰と言います。このコードだと O(x) 回ほど pati が呼び出され、その計算結果が積み上がって全体の計算結果が組み立てられるような動きになります。 もし再帰の概念に馴染みがなければ、「ハノイの塔」について調べると分かりやすいと思います。
Moai101

2019/01/09 05:52

返信遅れました。ありがとうございます!なんとか解決できました
set0gut1

2019/01/09 07:42

おめでとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問