SlideShare una empresa de Scribd logo
1 de 20
Descargar para leer sin conexión
paizaオンラインハッカソン(略して 
POH![ポー!])Lite「天才火消しエン 
ジニア霧島 もしPMおじさんが『丸投 
げ』を覚えたら」解説 
ギノ株式会社 吉岡
問題 
https://paiza.jp/poh/kirishima
問題 
• 人数(q)と費用(r)の組みがn個ある。 
• 合計 m人 以上の組み合わせを探す。 
• その中で最低の費用を出力する。 
• 1≤n≤ 50 
1≤q≤ 10,000 
1≤r≤ 5,000,000 
1≤m≤ 200,000
解法1(全探索) 
• 各社について、使う・使わないの全組み合わせ 
を走査する。 
• 合計がm人以上の組み合わせか判定する。 
• その中で、一番小さい組み合わせを探す。
コード例1-1 
(全探索、再帰)
@m 
= 
gets.to_i 
@n 
= 
gets.to_i 
@companies 
= 
[] 
@n.times{ 
q, 
r 
= 
gets.split.map(&:to_i) 
@companies.push([q, 
r]) 
} 
def 
calc(i, 
engineers, 
cost) 
if 
i 
== 
@n 
if 
engineers 
>= 
@m 
return 
cost 
else 
return 
999999999999 
end 
end 
ret1 
= 
calc(i+1, 
engineers, 
cost) 
ret2 
= 
calc(i+1, 
engineers+@companies[i][0], 
cost 
+@companies[i][1]) 
return 
[ret1, 
ret2].min 
end 
puts 
calc(0, 
0, 
0)
コード例1-2 
(全探索、ビット演算) 
10進数2進数(0埋め3桁) 
0 000 
1 001 
2 010 
3 011 
4 100 
5 101 
6 110 
7 111
@m 
= 
gets.to_i 
@n 
= 
gets.to_i 
@companies 
= 
[] 
@n.times{ 
q, 
r 
= 
gets.split.map(&:to_i) 
@companies.push([q, 
r]) 
} 
mincost 
= 
99999999999 
(0..2**@n).each{|i| 
engineers 
= 
0 
cost 
= 
0 
(0...@n).each{|j| 
if 
(i 
& 
(1<<j) 
!= 
0) 
then 
engineers 
+= 
@companies[j][0] 
cost 
+= 
@companies[j][1] 
end 
} 
if 
engineers 
>= 
@m 
mincost 
= 
[mincost, 
cost].min 
end 
} 
puts 
mincost
計算量 
• 計算量(Complexity)とは? 
• O(x): 定数倍の差を無視した計算量 
• O(g(n)) = {f(n): ある正の定数c, n0が存在して、 
すべてのn>n0に対して0≤f(n)≤cg(n)を満たす} 
• アルゴリズムの効率の評価に多く使われる
計算量 
• 各社、「使う」「使わない」の2通り 
• 2^n通りの組み合わせ 
=> 2^n に比例した時間がかかる。 
=> 計算量: O(2^n) 
• n=50なので、合計1,125,899,906,842,624通 
り
効率は上げれないか?
解法2 
(動的計画法) 
• 動的計画法とは 
問題を解いていく途中の結果を記録しておき、 
再利用することで効率を上げる方法
解法2 
(動的計画法) 
• 最大人数をサイズとするメモ配列(DP[人数])を用 
意し、コストを記録していく。 
• 各会社をループ 
• 各メモ配列(DP)をループ 
• DP[メモ配列の人数+会社の人数] 
=MIN(メモ配列のコスト + 会社のコスト, 
DP[メモ配列の人数+会社の人数])
コード
m 
= 
gets.to_i 
n 
= 
gets.to_i 
dp 
= 
Array.new(m+1, 
9999999999999) 
dp[0] 
= 
0 
n.times{ 
q, 
r 
= 
gets.split.map(&:to_i) 
m.downto(0).each{|i| 
q2 
= 
[i+q, 
m].min 
dp[q2] 
= 
[dp[q2], 
dp[i]+r].min 
} 
} 
puts 
dp[m]
計算量 
• 会社数(m) x 最大人数(n) がループ回数 
• O(m x n) 
• 最大ループ回数: 10,000,000 回
参考 
• 詳しくはblog 
『もし先輩女子エンジニアが『アルゴリズム』 
を図解で教えてくれるとしたら』 
http://paiza.hatenablog.com/entry/2014/09/11/%E3%82%82%E3%81%97%E5%85%88%E8%BC%A9%E5%A5%B3%E5%AD 
%90%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E3%80%8E%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA 
%E3%83%A0%E3%80%8F%E3%82%92%E5%9B%B3

Más contenido relacionado

Destacado

141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会paiza
 
mod7占い【上級・アルゴリズム】解説
mod7占い【上級・アルゴリズム】解説mod7占い【上級・アルゴリズム】解説
mod7占い【上級・アルゴリズム】解説paiza
 
ハノイの塔 解説
ハノイの塔 解説ハノイの塔 解説
ハノイの塔 解説paiza
 
シリコンバレー 面接体験
シリコンバレー 面接体験シリコンバレー 面接体験
シリコンバレー 面接体験paiza
 
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」paiza
 
paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paiza
 
scikit-learnを用いた機械学習チュートリアル
scikit-learnを用いた機械学習チュートリアルscikit-learnを用いた機械学習チュートリアル
scikit-learnを用いた機械学習チュートリアル敦志 金谷
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Ryosuke Okuta
 
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)徹 上野山
 
機械学習概論 講義テキスト
機械学習概論 講義テキスト機械学習概論 講義テキスト
機械学習概論 講義テキストEtsuji Nakai
 
Deep Learningと画像認識   ~歴史・理論・実践~
Deep Learningと画像認識 ~歴史・理論・実践~Deep Learningと画像認識 ~歴史・理論・実践~
Deep Learningと画像認識   ~歴史・理論・実践~nlab_utokyo
 
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築Tatsuya Tojima
 
Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Ken Morishita
 
機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話Ryota Kamoshida
 
機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual Talks機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual TalksYuya Unno
 

Destacado (15)

141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会
 
mod7占い【上級・アルゴリズム】解説
mod7占い【上級・アルゴリズム】解説mod7占い【上級・アルゴリズム】解説
mod7占い【上級・アルゴリズム】解説
 
ハノイの塔 解説
ハノイの塔 解説ハノイの塔 解説
ハノイの塔 解説
 
シリコンバレー 面接体験
シリコンバレー 面接体験シリコンバレー 面接体験
シリコンバレー 面接体験
 
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
 
paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺
 
scikit-learnを用いた機械学習チュートリアル
scikit-learnを用いた機械学習チュートリアルscikit-learnを用いた機械学習チュートリアル
scikit-learnを用いた機械学習チュートリアル
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
 
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
 
機械学習概論 講義テキスト
機械学習概論 講義テキスト機械学習概論 講義テキスト
機械学習概論 講義テキスト
 
Deep Learningと画像認識   ~歴史・理論・実践~
Deep Learningと画像認識 ~歴史・理論・実践~Deep Learningと画像認識 ~歴史・理論・実践~
Deep Learningと画像認識   ~歴史・理論・実践~
 
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
 
Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識
 
機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話機械学習によるデータ分析まわりのお話
機械学習によるデータ分析まわりのお話
 
機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual Talks機械学習チュートリアル@Jubatus Casual Talks
機械学習チュートリアル@Jubatus Casual Talks
 

Similar a paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説

DS Exercise Course 2
DS Exercise Course 2DS Exercise Course 2
DS Exercise Course 2大貴 末廣
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011finalMikio Kubo
 
WUPC2nd A問題
WUPC2nd A問題WUPC2nd A問題
WUPC2nd A問題Dai Hamada
 
Python基礎その1
Python基礎その1Python基礎その1
Python基礎その1大貴 末廣
 
Mining of massive datasets chapter3
Mining of massive datasets chapter3Mining of massive datasets chapter3
Mining of massive datasets chapter3Maruyama Tetsutaro
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミングNaoya Okanami
 
Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法Nagi Teramo
 
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015SaitoTsutomu
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Kenji Otsuka
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016kyoto university
 
Infer.netによるldaの実装
Infer.netによるldaの実装Infer.netによるldaの実装
Infer.netによるldaの実装池田 直哉
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますAI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますfukuoka.ex
 

Similar a paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説 (19)

DS Exercise Course 2
DS Exercise Course 2DS Exercise Course 2
DS Exercise Course 2
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011final
 
WUPC2nd A問題
WUPC2nd A問題WUPC2nd A問題
WUPC2nd A問題
 
Python基礎その1
Python基礎その1Python基礎その1
Python基礎その1
 
PFI Christmas seminar 2009
PFI Christmas seminar 2009PFI Christmas seminar 2009
PFI Christmas seminar 2009
 
Gurobi python
Gurobi pythonGurobi python
Gurobi python
 
Mining of massive datasets chapter3
Mining of massive datasets chapter3Mining of massive datasets chapter3
Mining of massive datasets chapter3
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミング
 
T69 episteme
T69 epistemeT69 episteme
T69 episteme
 
Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法
 
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
Infer.netによるldaの実装
Infer.netによるldaの実装Infer.netによるldaの実装
Infer.netによるldaの実装
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
Coqチュートリアル
CoqチュートリアルCoqチュートリアル
Coqチュートリアル
 
JSIAM_2019_9_4
JSIAM_2019_9_4JSIAM_2019_9_4
JSIAM_2019_9_4
 
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますAI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
 

paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説