SlideShare a Scribd company logo
AtCoder Beginner Contest 015 解説 
AtCoder株式会社 代表取締役 
高橋 直大 
2014/11/22 
1
競技プログラミングを始める前に 
•競技プログラミングをやったことがない人へ 
–まずはこっちのスライドを見よう! 
–http://www.slideshare.net/chokudai/abc004 
2014/11/22 
2
©AtCoder Inc. All rights reserved. 
3 
A問題 高橋くんの研修 
1.問題概要 
2.アルゴリズム 
2014/11/22
A問題 問題概要 
2014/11/22 
•文字列 S がA, Bが与えられる 
•文字数が多い方を出力せよ 
•制約 
•1 ≦ |A|, |B|≦ 10 
–|S| は文字列Sの長さを表します! 
•|A| ≠ |B| 
4
A問題 アルゴリズム 
•基本的なプログラムの流れ 
–標準入力から、必要な入力を受け取る 
•今回の場合は、 A,B という2つの文字列 
–問題で与えられた処理を行う 
•今回は、長い方を調べる 
–標準出力へ、答えを出力する 
•長い方を出力する 
2014/11/22 
5
A問題 アルゴリズム 
•入力 
–2つの文字列を、標準入力から受け取る 
•Cであれば、scanf(“%s”, &A); など 
•C++であれば、cin >> A; 
•入力の受け取り方は、下記の練習問題に記載があります。 
–http://practice.contest.atcoder.jp/tasks/practice_1 
•↑の例では一つ分しか書いてないよ! 
2014/11/22 
6
A問題 アルゴリズム 
•今回の問題は、文字列の長さを比較するだけ 
–文字列の長さを取得する関数は、どの言語にも基本的に 入っている 
•もし見つからなかったら、終端文字(¥0)までループを回して文字 数を数えよう! 
•不等号の向きを間違えないようにしよう! 
2014/11/22 
7
A問題 アルゴリズム 
•出力 
–求めた答えを、標準出力より出力する。 
–言語によって違います。 
•答えをSに入れたとする 
•printf(“%s¥n”, S); (C) 
•cout << S << endl; (C++) 
•System.out.println(S); (Java) 
•各言語の標準出力は、下記の練習問題に記載があります。 
–http://practice.contest.atcoder.jp/tasks/practice_1 
2014/11/22 
8
©AtCoder Inc. All rights reserved. 
9 
B問題 高橋くんの集計 
1.問題概要 
2.アルゴリズム 
2014/11/22
B問題 問題概要 
•N個の整数が与えられる 
•0以外の整数の平均値を出力しなさい 
2014/11/22 
10
B問題 アルゴリズム 
•入力 
–整数Nを受け取る 
–数列Aの数字をN個受け取る 
•受け取り方は複数いくつかある 
–1行纏めて受け取って、スペースでsplitする 
–1つずつ受け取る 
•言語によって受け取りやすい書き方が違う! 
•詳しくはpracticeで確認しよう! 
–http://practice.contest.atcoder.jp/tasks/practice_1 
2014/11/22 
11
B問題 アルゴリズム 
•処理 
–やるべきことは2つ! 
•バグの総数を調べる 
–こちらはforループを回して足し算をしていくだけ 
•バグが存在するソフトウェアの個数を調べる 
–こちらは、ifなどで判定してカウントする 
–この2つが出来れば、あとは平均を取る! 
•切り上げることに注意! 
•切り上げる方法も多数 
–あまりが0でなかった場合、答えに1を足す 
–一つの計算式で表すことも可能 
»(sum + count – 1)/ count 
2014/11/22 
12
B問題 アルゴリズム 
•出力 
–A問題と同じく、答えを出力するだけ 
–Print(ret)みたいな感じ 
2014/11/22 
13
©AtCoder Inc. All rights reserved. 
14 
C問題 高橋くんのバグ探し 
1.問題概要 
2.アルゴリズム 
2014/11/22
C問題 問題概要 
•K択問題がN個あります。 
•全ての選択肢に内部的に整数が割り当てられてお り、選ばれた選択肢のXOR(排他的論理和)の値を利 用するが、この値が0になるとバグが発生する。 
•選択肢に割り当てられた整数が与えられるので、バ グが発生することがあり得るかを判定しなさい。 
•制約 
–1 ≦ N ≦ 5 
–1 ≦ K ≦ 5 
–0 ≦ Ti,j ≦ 127 
2014/11/22 
15
C問題 アルゴリズム 
•どう解くか? 
–質問の数は5つ、選択肢も5つ 
•非常に数が少ない! 
–つまり、全探索することが可能! 
–どうやって全探索をしよう? 
2014/11/22
C問題 アルゴリズム 
•1つの質問だったら? 
–ForループでK回回せば、全通り試せる 
•2つの質問だったら? 
–Forループを2重で組み合わせれば、全通り試せる 
•3つの質問だったら? 
–Forループを3重で組み合わせれば、全通り試せる 
•・・・・こんなのはやってられない! 
2014/11/22
C問題 アルゴリズム 
•1つの質問だったら? 
–ForループでK回回せば、全通り試せる 
•2つの質問だったら? 
–Forループを2重で組み合わせれば、全通り試せる 
•3つの質問だったら? 
–Forループを3重で組み合わせれば、全通り試せる 
•・・・・こんなのはやってられない! 
2014/11/22
C問題 アルゴリズム 
•ではどう解くか? 
•深さ優先探索を使おう! 
–深さ優先探索って? 
2014/11/22
C問題 アルゴリズム 
•深さ優先探索 
–こんなの 
2014/11/22 
スタート 
質問1A 
質問1B 
質問1C 
質問2A 
質問2B 
質問2C 
質問2A 
質問2B 
質問2C
C問題 アルゴリズム 
•深さ優先探索 
–こんなの 
2014/11/22 
スタート 
質問1A 
質問1B 
質問1C 
質問2A 
質問2B 
質問2C 
質問2A 
質問2B 
質問2C
C問題 アルゴリズム 
•要するにどういうこと? 
–質問や選択肢の数に合わせて、潜って行くように探索し ていく! 
–こうすることで、全ての質問の組み合わせに対して調べる ことが出来る! 
•でもどう組むの? 
2014/11/22
C問題 アルゴリズム 
•再帰関数を使おう! 
–自分の関数の内部で、自分を呼び出す! 
–例えばこんな感じ 
•最初はdfs(0, 0);って感じで呼び出す 
bool dfs(int numQ, int value){ 
if(numQ == N) return (value == 0); 
for(int i = 0; i < K; i++){ 
if(dfs(numQ+1, value^T[numQ,i])) return true; 
} 
return false; 
} 
2014/11/22 
dfs関数の中から、 
dfsをもう一度呼び出す! 
今の質問数、値から 今どこにいるかを格納 
質問がもうなければ 
0になっているかを調べる 
探索した結果、0になる組 み合わせが無ければfalse
C問題 アルゴリズム 
•計算時間は大丈夫? 
–N回の質問で、K回の選択肢 
–全ての組み合わせは퐾푁個 
–N,Kともに5以下なので、この組み合わせの数は大したこと がない 
•最も深いループが1億程度回らなければ、制限時間に間に合うこ とが多い 
2014/11/22
C問題 アルゴリズム 
•他の方法は? 
–深さ優先探索で、もう少し工夫する方法 
•「今までの質問数」「ここまでの値」が同じものを1度調べていれば、 もう調べる必要がない 
–こうすることにより、計算量を퐾푁からNKまで減らせる 
–幅優先探索などでももちろん良い 
•一筆書きのように調べるのではなく、1手1手進めていく方法 
•詳しくは他の幅優先探索を使う問題を見てね! 
2014/11/22
©AtCoder Inc. All rights reserved. 
26 
D問題 高橋くんの苦悩 
1.問題概要 
2.アルゴリズム 
2014/11/22
C問題 問題概要 
•幅Wの領域に、幅A[i]、価値B[i]の、N枚のスクショを選 択して貼りつける 
•貼りつけられるスクショは、 
–合計枚数がK枚以下 
–合計の幅がW以下 
•でなければならない。価値の和の最大値を求めなさい。 
•制約 
–1≦N≦50 
–1≦W≦10000 
–1≦A[i],B[i]≦1000 
2014/11/22
D問題 アルゴリズム 
•どういう問題? 
•非常に有名な「ナップサック問題」の亜種です 
–商品がN個、重さWまで持てる。 
–各商品の重さA[i]と、価値B[i]が与えられる 
–価値を最大化しなさい 
•今回は、それに加えて、「商品の個数」が制約に加 わっている 
2014/11/22
D問題 アルゴリズム 
•深さ優先探索で解ける? 
–今回は、C問題に合わせると、 
•N個の商品について、「選ぶ」「選ばない」を選ぶ必要があります。 
•XORではなく価値の和を最大化したいです。 
•いくつかの制約があります 
–みたいな問題になるため、似たような深さ優先探索で、答 えを求めることは可能です。 
•ただし、制限時間内に終わるわけではない! 
–計算量を考えよう! 
•選択肢は「選ぶ」「選ばない」の2つ 
•商品はN個、つまり50個以下 
–2の50乗は10の15乗程度だが、これは組み合わせが多過ぎる 
2014/11/22
D問題 アルゴリズム 
•では、どうするか? 
–全部調べるのはなんとなくもったいない 
–計算を上手く纏められると嬉しい。 
–そこで出てくるのが「動的計画法!」 
2014/11/22
D問題 アルゴリズム 
•動的計画法って? 
–ある状態に対して、「すでに訪れたか」や「最大値」「最小 値」を計算することで、無駄に計算をしないこと! 
–状態って何? 
•「今持ってる価値」とか「何個目まで調べた」とか「今選んだスク ショの合計の幅」とか、そのような、探索をする上で必要な情報! 
2014/11/22
D問題 アルゴリズム 
•さっきと同じ感じで、深さ優先探索のイメージをして みよう! 
–自分が書くならこんな感じ 
•Int dfs(int useW, int useNum, int now) { 以下略 
–useWは、「今まで選んだスクショの合計幅」 
–useNumは、「今まで選んだスクショの数」 
–Nowは、「今選ぶかどうか調べたいスクショが何枚目か」 
»これに対して、dfs(0,0,0)みたいな感じで呼び出したい 
»で、最大値が返ってくると嬉しい 
–これで動いたら嬉しい! 
•でも実際は間に合わない 
2014/11/22
D問題 アルゴリズム 
•どうすれば良いか? 
–解法1:メモ化再帰を使う 
•メモ化再帰って? 
–深さ優先探索で書いた時に、同じ計算を省略する! 
–解法2:動的計画法を使う 
»っていっても、メモ化再帰も動的計画法の一種ですが 
•「幅」「使った枚数」「何枚目まで見たか」に対して、価値の最大値 を計算する 
–再帰ではなく、ボトムアップで計算する! 
2014/11/22
D問題 アルゴリズム 
•解法1:メモ化再帰を使う 
–どう計算を省略するの? 
•要するに、同じ計算をしなければ良い 
•結果メモ用配列dp[W][N][N]を用意する 
•Int dfs(int useW, int useNum, int now)とか書いたとする 
–もしdp[useW][useNum][now]に既に数が入っていたら、その数を返 す 
–入っていなければ普通に計算をし、returnするときに、 dp[useW][useNum][now]に、returnする数を入れる 
»こうすることにより、2回目から計算しなくて良くなる! 
–計算量は? 
•同じ計算をしなくなったので、useW, useNum, nowの組み合わせ が何通りあるか調べれば良い 
–これはそれぞれW,N,Nであり、それに対して2択の選択肢 
–5000万くらい!よってギリギリ間に合う! 
2014/11/22
D問題 アルゴリズム 
•解法2:動的計画法を使う! 
–dp[i][j][k]に、k番目まで調べた時の、幅合計i、使用枚数j の最大値を入れるとする 
–これは、dp[i][j][k-1]か、dp[i-A[k-1]][j-1][k-1]+B[k-1]のどち らかしかありえない! 
•なぜか? 
•K番目まで調べて、幅i、枚数jが最大になる、ということは、K番目 のスクショを選んで最大になったか、選ばず最大になったか、どち らかしかない 
–K番目を使わない場合は、dp[i][j][k-1] 
–K番目を使う場合は、使う前がdp[i-A[k-1]][j-1][k-1]であり、そこにB[k- 1]を足すことで、求めることが出来る!! 
2014/11/22
D問題 アルゴリズム 
•解法3:動的計画法を使う!工夫する版! 
–解法2のkは実は省略できる 
•K番目を使わない場合→そのまま 
•K番目を使う場合→dp[i][j] = dp[i-A[k-1]][j-1] 
–みたいな感じで、同じメモリ上で回すことが出来る 
–ただし、この場合、「同じスクショを2回以上使わない工 夫」をする必要がある。 
•具体的には、ループの向きを逆にすると良い! 
•逆にすれば、「直前に足したのをまた足してしまう」ということがな くなる 
–詳しくは生放送で実装の時に説明するよ!! 
2014/11/22

More Related Content

What's hot

AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
AtCoder Inc.
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説
AtCoder Inc.
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
AtCoder Inc.
 
AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説
AtCoder Inc.
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
AtCoder Inc.
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説
AtCoder Inc.
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
AtCoder Inc.
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
AtCoder Inc.
 
Abc009
Abc009Abc009
Abc009
AtCoder Inc.
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2
AtCoder Inc.
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
AtCoder Inc.
 
abc027
abc027abc027
abc027
AtCoder Inc.
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説
AtCoder Inc.
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
AtCoder Inc.
 
AtCoder167Dをダブリングで解く
AtCoder167Dをダブリングで解くAtCoder167Dをダブリングで解く
AtCoder167Dをダブリングで解く
Akira KANAI
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
AtCoder Inc.
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説
AtCoder Inc.
 
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説
AtCoder Inc.
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
AtCoder Inc.
 

What's hot (20)

AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
 
AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 
Abc009
Abc009Abc009
Abc009
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
abc027
abc027abc027
abc027
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
AtCoder167Dをダブリングで解く
AtCoder167Dをダブリングで解くAtCoder167Dをダブリングで解く
AtCoder167Dをダブリングで解く
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説
 
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
 

Similar to AtCoder Beginner Contest 015 解説

AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
AtCoder Inc.
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
AtCoder Inc.
 
AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説
AtCoder Inc.
 
AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説
AtCoder Inc.
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
AtCoder Inc.
 
今日からできる構造学習(主に構造化パーセプトロンについて)
今日からできる構造学習(主に構造化パーセプトロンについて)今日からできる構造学習(主に構造化パーセプトロンについて)
今日からできる構造学習(主に構造化パーセプトロンについて)
syou6162
 
Ruby で学ぶプログラミング入門
Ruby で学ぶプログラミング入門Ruby で学ぶプログラミング入門
Ruby で学ぶプログラミング入門
Ryota Kameoka
 
Jacet2014ykondo_final
Jacet2014ykondo_finalJacet2014ykondo_final
Jacet2014ykondo_final
早稲田大学
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミング
Naoya Okanami
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版Masami Yabushita
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかMasami Yabushita
 
金大アルゴリズム勉強会#001資料
金大アルゴリズム勉強会#001資料金大アルゴリズム勉強会#001資料
金大アルゴリズム勉強会#001資料
Takumi Murano
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説
AtCoder Inc.
 
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
AtCoder Inc.
 
Coding Interview
Coding InterviewCoding Interview
Coding Interview
信之 岩永
 
虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver
Kensuke Otsuki
 
Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016
kyon mm
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
AtCoder Inc.
 
Pythonではじめる競技プログラミング
Pythonではじめる競技プログラミングPythonではじめる競技プログラミング
Pythonではじめる競技プログラミング
cocodrips
 
Sta introduction in_kyoto #devkan
Sta introduction in_kyoto #devkanSta introduction in_kyoto #devkan
Sta introduction in_kyoto #devkan
kyon mm
 

Similar to AtCoder Beginner Contest 015 解説 (20)

AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
 
AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説
 
AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
 
今日からできる構造学習(主に構造化パーセプトロンについて)
今日からできる構造学習(主に構造化パーセプトロンについて)今日からできる構造学習(主に構造化パーセプトロンについて)
今日からできる構造学習(主に構造化パーセプトロンについて)
 
Ruby で学ぶプログラミング入門
Ruby で学ぶプログラミング入門Ruby で学ぶプログラミング入門
Ruby で学ぶプログラミング入門
 
Jacet2014ykondo_final
Jacet2014ykondo_finalJacet2014ykondo_final
Jacet2014ykondo_final
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミング
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
 
金大アルゴリズム勉強会#001資料
金大アルゴリズム勉強会#001資料金大アルゴリズム勉強会#001資料
金大アルゴリズム勉強会#001資料
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説
 
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
 
Coding Interview
Coding InterviewCoding Interview
Coding Interview
 
虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver
 
Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
 
Pythonではじめる競技プログラミング
Pythonではじめる競技プログラミングPythonではじめる競技プログラミング
Pythonではじめる競技プログラミング
 
Sta introduction in_kyoto #devkan
Sta introduction in_kyoto #devkanSta introduction in_kyoto #devkan
Sta introduction in_kyoto #devkan
 

More from AtCoder Inc.

TCO2017R1
TCO2017R1TCO2017R1
TCO2017R1
AtCoder Inc.
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
AtCoder Inc.
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
AtCoder Inc.
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001
AtCoder Inc.
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
AtCoder Inc.
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
AtCoder Inc.
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
AtCoder Inc.
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
AtCoder Inc.
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
AtCoder Inc.
 
arc047
arc047arc047
arc047
AtCoder Inc.
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
AtCoder Inc.
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
AtCoder Inc.
 
abc031
abc031abc031
abc031
AtCoder Inc.
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説
AtCoder Inc.
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
AtCoder Inc.
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
AtCoder Inc.
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
AtCoder Inc.
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
AtCoder Inc.
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
AtCoder Inc.
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説
AtCoder Inc.
 

More from AtCoder Inc. (20)

TCO2017R1
TCO2017R1TCO2017R1
TCO2017R1
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
arc047
arc047arc047
arc047
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
abc031
abc031abc031
abc031
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説
 

AtCoder Beginner Contest 015 解説

  • 1. AtCoder Beginner Contest 015 解説 AtCoder株式会社 代表取締役 高橋 直大 2014/11/22 1
  • 3. ©AtCoder Inc. All rights reserved. 3 A問題 高橋くんの研修 1.問題概要 2.アルゴリズム 2014/11/22
  • 4. A問題 問題概要 2014/11/22 •文字列 S がA, Bが与えられる •文字数が多い方を出力せよ •制約 •1 ≦ |A|, |B|≦ 10 –|S| は文字列Sの長さを表します! •|A| ≠ |B| 4
  • 5. A問題 アルゴリズム •基本的なプログラムの流れ –標準入力から、必要な入力を受け取る •今回の場合は、 A,B という2つの文字列 –問題で与えられた処理を行う •今回は、長い方を調べる –標準出力へ、答えを出力する •長い方を出力する 2014/11/22 5
  • 6. A問題 アルゴリズム •入力 –2つの文字列を、標準入力から受け取る •Cであれば、scanf(“%s”, &A); など •C++であれば、cin >> A; •入力の受け取り方は、下記の練習問題に記載があります。 –http://practice.contest.atcoder.jp/tasks/practice_1 •↑の例では一つ分しか書いてないよ! 2014/11/22 6
  • 7. A問題 アルゴリズム •今回の問題は、文字列の長さを比較するだけ –文字列の長さを取得する関数は、どの言語にも基本的に 入っている •もし見つからなかったら、終端文字(¥0)までループを回して文字 数を数えよう! •不等号の向きを間違えないようにしよう! 2014/11/22 7
  • 8. A問題 アルゴリズム •出力 –求めた答えを、標準出力より出力する。 –言語によって違います。 •答えをSに入れたとする •printf(“%s¥n”, S); (C) •cout << S << endl; (C++) •System.out.println(S); (Java) •各言語の標準出力は、下記の練習問題に記載があります。 –http://practice.contest.atcoder.jp/tasks/practice_1 2014/11/22 8
  • 9. ©AtCoder Inc. All rights reserved. 9 B問題 高橋くんの集計 1.問題概要 2.アルゴリズム 2014/11/22
  • 10. B問題 問題概要 •N個の整数が与えられる •0以外の整数の平均値を出力しなさい 2014/11/22 10
  • 11. B問題 アルゴリズム •入力 –整数Nを受け取る –数列Aの数字をN個受け取る •受け取り方は複数いくつかある –1行纏めて受け取って、スペースでsplitする –1つずつ受け取る •言語によって受け取りやすい書き方が違う! •詳しくはpracticeで確認しよう! –http://practice.contest.atcoder.jp/tasks/practice_1 2014/11/22 11
  • 12. B問題 アルゴリズム •処理 –やるべきことは2つ! •バグの総数を調べる –こちらはforループを回して足し算をしていくだけ •バグが存在するソフトウェアの個数を調べる –こちらは、ifなどで判定してカウントする –この2つが出来れば、あとは平均を取る! •切り上げることに注意! •切り上げる方法も多数 –あまりが0でなかった場合、答えに1を足す –一つの計算式で表すことも可能 »(sum + count – 1)/ count 2014/11/22 12
  • 13. B問題 アルゴリズム •出力 –A問題と同じく、答えを出力するだけ –Print(ret)みたいな感じ 2014/11/22 13
  • 14. ©AtCoder Inc. All rights reserved. 14 C問題 高橋くんのバグ探し 1.問題概要 2.アルゴリズム 2014/11/22
  • 15. C問題 問題概要 •K択問題がN個あります。 •全ての選択肢に内部的に整数が割り当てられてお り、選ばれた選択肢のXOR(排他的論理和)の値を利 用するが、この値が0になるとバグが発生する。 •選択肢に割り当てられた整数が与えられるので、バ グが発生することがあり得るかを判定しなさい。 •制約 –1 ≦ N ≦ 5 –1 ≦ K ≦ 5 –0 ≦ Ti,j ≦ 127 2014/11/22 15
  • 16. C問題 アルゴリズム •どう解くか? –質問の数は5つ、選択肢も5つ •非常に数が少ない! –つまり、全探索することが可能! –どうやって全探索をしよう? 2014/11/22
  • 17. C問題 アルゴリズム •1つの質問だったら? –ForループでK回回せば、全通り試せる •2つの質問だったら? –Forループを2重で組み合わせれば、全通り試せる •3つの質問だったら? –Forループを3重で組み合わせれば、全通り試せる •・・・・こんなのはやってられない! 2014/11/22
  • 18. C問題 アルゴリズム •1つの質問だったら? –ForループでK回回せば、全通り試せる •2つの質問だったら? –Forループを2重で組み合わせれば、全通り試せる •3つの質問だったら? –Forループを3重で組み合わせれば、全通り試せる •・・・・こんなのはやってられない! 2014/11/22
  • 19. C問題 アルゴリズム •ではどう解くか? •深さ優先探索を使おう! –深さ優先探索って? 2014/11/22
  • 20. C問題 アルゴリズム •深さ優先探索 –こんなの 2014/11/22 スタート 質問1A 質問1B 質問1C 質問2A 質問2B 質問2C 質問2A 質問2B 質問2C
  • 21. C問題 アルゴリズム •深さ優先探索 –こんなの 2014/11/22 スタート 質問1A 質問1B 質問1C 質問2A 質問2B 質問2C 質問2A 質問2B 質問2C
  • 22. C問題 アルゴリズム •要するにどういうこと? –質問や選択肢の数に合わせて、潜って行くように探索し ていく! –こうすることで、全ての質問の組み合わせに対して調べる ことが出来る! •でもどう組むの? 2014/11/22
  • 23. C問題 アルゴリズム •再帰関数を使おう! –自分の関数の内部で、自分を呼び出す! –例えばこんな感じ •最初はdfs(0, 0);って感じで呼び出す bool dfs(int numQ, int value){ if(numQ == N) return (value == 0); for(int i = 0; i < K; i++){ if(dfs(numQ+1, value^T[numQ,i])) return true; } return false; } 2014/11/22 dfs関数の中から、 dfsをもう一度呼び出す! 今の質問数、値から 今どこにいるかを格納 質問がもうなければ 0になっているかを調べる 探索した結果、0になる組 み合わせが無ければfalse
  • 24. C問題 アルゴリズム •計算時間は大丈夫? –N回の質問で、K回の選択肢 –全ての組み合わせは퐾푁個 –N,Kともに5以下なので、この組み合わせの数は大したこと がない •最も深いループが1億程度回らなければ、制限時間に間に合うこ とが多い 2014/11/22
  • 25. C問題 アルゴリズム •他の方法は? –深さ優先探索で、もう少し工夫する方法 •「今までの質問数」「ここまでの値」が同じものを1度調べていれば、 もう調べる必要がない –こうすることにより、計算量を퐾푁からNKまで減らせる –幅優先探索などでももちろん良い •一筆書きのように調べるのではなく、1手1手進めていく方法 •詳しくは他の幅優先探索を使う問題を見てね! 2014/11/22
  • 26. ©AtCoder Inc. All rights reserved. 26 D問題 高橋くんの苦悩 1.問題概要 2.アルゴリズム 2014/11/22
  • 27. C問題 問題概要 •幅Wの領域に、幅A[i]、価値B[i]の、N枚のスクショを選 択して貼りつける •貼りつけられるスクショは、 –合計枚数がK枚以下 –合計の幅がW以下 •でなければならない。価値の和の最大値を求めなさい。 •制約 –1≦N≦50 –1≦W≦10000 –1≦A[i],B[i]≦1000 2014/11/22
  • 28. D問題 アルゴリズム •どういう問題? •非常に有名な「ナップサック問題」の亜種です –商品がN個、重さWまで持てる。 –各商品の重さA[i]と、価値B[i]が与えられる –価値を最大化しなさい •今回は、それに加えて、「商品の個数」が制約に加 わっている 2014/11/22
  • 29. D問題 アルゴリズム •深さ優先探索で解ける? –今回は、C問題に合わせると、 •N個の商品について、「選ぶ」「選ばない」を選ぶ必要があります。 •XORではなく価値の和を最大化したいです。 •いくつかの制約があります –みたいな問題になるため、似たような深さ優先探索で、答 えを求めることは可能です。 •ただし、制限時間内に終わるわけではない! –計算量を考えよう! •選択肢は「選ぶ」「選ばない」の2つ •商品はN個、つまり50個以下 –2の50乗は10の15乗程度だが、これは組み合わせが多過ぎる 2014/11/22
  • 30. D問題 アルゴリズム •では、どうするか? –全部調べるのはなんとなくもったいない –計算を上手く纏められると嬉しい。 –そこで出てくるのが「動的計画法!」 2014/11/22
  • 31. D問題 アルゴリズム •動的計画法って? –ある状態に対して、「すでに訪れたか」や「最大値」「最小 値」を計算することで、無駄に計算をしないこと! –状態って何? •「今持ってる価値」とか「何個目まで調べた」とか「今選んだスク ショの合計の幅」とか、そのような、探索をする上で必要な情報! 2014/11/22
  • 32. D問題 アルゴリズム •さっきと同じ感じで、深さ優先探索のイメージをして みよう! –自分が書くならこんな感じ •Int dfs(int useW, int useNum, int now) { 以下略 –useWは、「今まで選んだスクショの合計幅」 –useNumは、「今まで選んだスクショの数」 –Nowは、「今選ぶかどうか調べたいスクショが何枚目か」 »これに対して、dfs(0,0,0)みたいな感じで呼び出したい »で、最大値が返ってくると嬉しい –これで動いたら嬉しい! •でも実際は間に合わない 2014/11/22
  • 33. D問題 アルゴリズム •どうすれば良いか? –解法1:メモ化再帰を使う •メモ化再帰って? –深さ優先探索で書いた時に、同じ計算を省略する! –解法2:動的計画法を使う »っていっても、メモ化再帰も動的計画法の一種ですが •「幅」「使った枚数」「何枚目まで見たか」に対して、価値の最大値 を計算する –再帰ではなく、ボトムアップで計算する! 2014/11/22
  • 34. D問題 アルゴリズム •解法1:メモ化再帰を使う –どう計算を省略するの? •要するに、同じ計算をしなければ良い •結果メモ用配列dp[W][N][N]を用意する •Int dfs(int useW, int useNum, int now)とか書いたとする –もしdp[useW][useNum][now]に既に数が入っていたら、その数を返 す –入っていなければ普通に計算をし、returnするときに、 dp[useW][useNum][now]に、returnする数を入れる »こうすることにより、2回目から計算しなくて良くなる! –計算量は? •同じ計算をしなくなったので、useW, useNum, nowの組み合わせ が何通りあるか調べれば良い –これはそれぞれW,N,Nであり、それに対して2択の選択肢 –5000万くらい!よってギリギリ間に合う! 2014/11/22
  • 35. D問題 アルゴリズム •解法2:動的計画法を使う! –dp[i][j][k]に、k番目まで調べた時の、幅合計i、使用枚数j の最大値を入れるとする –これは、dp[i][j][k-1]か、dp[i-A[k-1]][j-1][k-1]+B[k-1]のどち らかしかありえない! •なぜか? •K番目まで調べて、幅i、枚数jが最大になる、ということは、K番目 のスクショを選んで最大になったか、選ばず最大になったか、どち らかしかない –K番目を使わない場合は、dp[i][j][k-1] –K番目を使う場合は、使う前がdp[i-A[k-1]][j-1][k-1]であり、そこにB[k- 1]を足すことで、求めることが出来る!! 2014/11/22
  • 36. D問題 アルゴリズム •解法3:動的計画法を使う!工夫する版! –解法2のkは実は省略できる •K番目を使わない場合→そのまま •K番目を使う場合→dp[i][j] = dp[i-A[k-1]][j-1] –みたいな感じで、同じメモリ上で回すことが出来る –ただし、この場合、「同じスクショを2回以上使わない工 夫」をする必要がある。 •具体的には、ループの向きを逆にすると良い! •逆にすれば、「直前に足したのをまた足してしまう」ということがな くなる –詳しくは生放送で実装の時に説明するよ!! 2014/11/22