HeadHunterプログラマースクールの参加者の第1回選考
が行われましたアンケートに記入した後、5つの問題を解決することが提案されました
アンケートでは、次のフィールドに記入するよう求められました。
- 氏名
- 生年月日
- メール
- 街
- 大学
- 教員
- 卒業年度
- 専門
- 最後のコースまたは卒業証書の科目
- 一番好きだったアイテム
- 職場と従業員の地位
- どの言語をプログラムしますか
- 開発経験を説明する
- オリンピアードと証明書への参加
- プログラムに興味を持った理由、参加からの期待
タスク1
状態
1 <= n <132、1 <= k <n、組み合わせの数C(n、k)> 1,000,000の場合、nとkの数はいくつですか?
思う
考えるべきことは何ですか? 132これは非常に小さく、完全な検索で十分です。Pythonで実装します。
SciPyパッケージから多くの組み合わせを実装します-多くの点で、これはオープンソースのMatlabです
決める
from scipy.misc import *
実行時間を測定して実行します。
間違いを見つけましたか?条件からプログラムへの制限が正しく転送されません
タスク2:
状態
バッグには赤と青のディスクが1つずつ入っています。 ゲーム中、プレイヤーはターンごとにバッグからランダムなディスクを取り出し、その色が記録されます。 各移動の後、取り込んだディスクはバッグに戻され、別の赤いディスクがそこに追加されます。
プレーヤーはゲームごとに1ユーロを支払い、ゲームの最後に赤いディスクよりも青いディスクを獲得した場合に勝ちます。 ゲームが4ターン続く場合、勝つ確率は11/120であるため、ゲームのホストがこのゲームで勝つために授与できる最大賞金は10ユーロです。そうでない場合、彼は負け始めます。
これは整数であり、参加の初期支払いが含まれているため、プレーヤーは実際に9ユーロを獲得することに注意してください。
30移動のゲームでリーダーに不利にならない最大賞金総額を見つけますか?
状態を理解している
ゲーム中、赤いボールの数が増えます。つまり、青いボールが1つしか得られない可能性が低くなります。 勝つためには、青の半分以上を取得する必要があります。 初めて、青の確率1/2を2回目に1/3と推測します。n回目に、青を取得する確率は1 /(n + 1)です。
条件から例を分析します
ゲームの期間が4ムーブの場合、確率は1 / 2、1 / 3、1 / 4、1 / 5です。 勝つために、あなたは一度だけミスをすることができます。 そして、どの試みにおいても、私たちは間違いを犯しました。 成功の確率を計算しましょう:1/60 + 1/40 + 1/30 + 1/24 + 1/120 = 15/120
思う
階乗30は小さな数字です。ここでも徹底的な検索を使用します。 組み合わせ番号ジェネレーターは
、 Pythonに組み込まれて
いるitertoolsパッケージ
から取得されます
決める
import itertools game=30 comb=[] resb=1 for t in range(2,game+2): comb.append(t) resb=resb*t
23分かかりますが、他の問題も解決します。
分数を最大ゲインに変換する必要があります-分母を分子で除算し、「自己返済」ゲインのサイズを取得します。
最大の前駆体が必要です;それに応じて、整数部分、つまり 1288459240
間違いを見つけましたか?ここで、間違った確率を考慮しました。 数えるとき、多くの赤から青を選択するだけでなく、多くの中から赤を選択する必要があります。 したがって、プログラムを変更します。
from datetime import datetime import itertools game=30 comb=[] resb=1 for t in range(2,game+2): comb.append(t) resb=resb*t print comb resa=0 st=datetime.now() for q in range(0,game/2):
答えは発売後15分です
タスク3:
数値に、左側の数値以上のすべての数値が含まれる場合、増加と呼ばれます。 例は133456です。したがって、数値が右側の数値より小さくない場合、減少と呼ばれます。 例:66420。
増加も減少もしていない数値をジャンプと呼びます。
跳ねる数は10 ^ 75未満ですか?
私たちは考えます:
完全な列挙は長く、帰納法は完全に適用されます(動的プログラミング)
実際、左側の数字を増やす場合は1から数字の最初の桁までを割り当て、右側の数字を減らす場合は0から数字の最後の数字までを割り当てることができます。
私たちは決定します:
間違いを見つけましたか?分析的に解決します。
増加する数、減少する数を見つけ、ミラー番号の数を引きます。
増加する数の数は、考慮事項から求められます。
セット{0,1,2,3,4,5,6,7,8,9}から複数の数字が与えられた場合、それらを昇順で並べることができます。
返品と注文を考慮せずに骨nサンプルを
取得します減少するものを自動的に配置することはできません-ゼロは常に数字の最後、または最初に行くでしょう。 したがって、数値{1,2,3,4,5,6,7,8,9}から選択し、空の場所にゼロを追加します。 空の場所は、すべての数字の前または後にのみ指定できます。それ以外の場合、ジャンプ番号が取得されます。 N個のゼロで、N + 1を途中で配置できます
import sys from scipy.misc import * game = int(sys.argv[1])
タスク4:
フィボナッチ数列のメンバーが1369であるようなメンバーの数を見つけます
私たちは考えます:
フィボナッチ数を考慮し、文字列表現に変換して長さを調べます。
私たちは決定します:
mlen=1369 a1=1 a2=1 ct=2 while len(str(a1+a2))<mlen: a3=a1+a2 a1=a2 a2=a3 ct=ct+1 ct=ct+1 print a3,len(str(a3)),ct
タスク5:
シリーズの最終合計の最後の10桁、1 ^ 1 + 2 ^ 2 + 3 ^ 3 + ... + 1145 ^ 1145を見つけます
私たちは考えます:
1145から1145度までの数字は本当に大きいです。 タスクでは、最後の10桁のみを要求します。これは、モジュラー演算を利用することを意味します。すぐにモジュロを考慮します。
私たちは決定します:
モジュロ度を計算するには、パッケージ
http://userpages.umbc.edu/~rcampbel/Computers/Python/numbthy.htmlを使用します
http://userpages.umbc.edu/~rcampbel/Computers/Python/lib/numbthy.pyをダウンロードして、プログラムフォルダーに配置します。
import numbthy as np t=0 for i in range(1,1146): t=t+np.powmod(i,i,1000000000000000000000) print t % 10000000000
彼らは、5つの問題のうち2つが正しく解決されたと言っています。