yukicoder No. 304-306 やった
#304 鍵(1)
No.304 鍵(1) - yukicoder
「この問題はリアクティブ問題です。」
…
……
………
*1
過去問のAC答案とGoogleに聞いた結果、
import sys
としておいて
print 'blahblahblah' sys.stdout.flush()
とすればいいらしいということを学ぶ。プログラミングの基礎がないのでこういうとき困る。
提出(AC
import sys for x in xrange(1000): print '{0:03}'.format(x) sys.stdout.flush() res = raw_input() if res == 'unlocked': break
4桁なので素直に1000通り総当り
ゼロ埋め
ゼロで埋めるのどうするのか忘れてたのでメモ、
print string.zfill(s, width) #数値を表現する文字列の左側に、指定の幅になるまでゼロを付加します。符号付きの数字も正しく処理します。 print '%03.d' %s # 0:ゼロ埋め 3:桁数 print '{:03}'.format(s) #
7.1. string — 一般的な文字列操作 — Python 2.7ja1 documentation
文字列フォーマット操作 (%形式) » Python Snippets
format関数による文字列フォーマット(新しい形式) » Python Snippets
#305 鍵(2)
No.305 鍵(2) - yukicoder
今度は番号が10桁になったかわりに、あってる桁の数(X)を教えてもらえる
(TLE
00...0 から 99...9 まで試すと使われてる数の個数はわかる
けどそのあとどう組み合わせればいいのかわからない!パーミュテイション??ってやったらTLE
import sys import itertools answerlike = '' for i in xrange(10): print str(i) * 10 sys.stdout.flush() res = raw_input().split()[0] if res == 10: exit() else: for _ in xrange(int(res)): answerlike += str(i) for p in itertools.permutations(answerlike): print ''.join(p) sys.stdout.flush() res = raw_input().split()[1] if res == 'unlocked': break
(AC
1桁ずつ特定していけばいいのだということに気付いて
00..00, 00..01, ... 00..09, → Xが大きいとこの数が1の位の正解
00..10, 00..20, ... 00..90, → Xが大きいとこの数が10の位の正解
て感じでつぶしてくと100回聞けばわかるはず
その桁の数字わかった時点でループやめたほうがいいとは思ったけど無視
import sys code = [] for i in xrange(10): digits = [] for j in xrange(10): ans = j * 10**i print str(ans).zfill(10) sys.stdout.flush() X = raw_input().split() X = int(X[0]) if X == 10: exit() else: digits.append(X) n = digits.index(max(digits)) code.append(n) code = code[::-1] code = map(str, code) print ''.join(code)
「ダイヤル式の南京錠は合ってる数字に合わせるときだけ音と感触が違う」って聞いたことあるけど本当なのかな。
そうだとするとこれと同じようにやるだけなので最大(10*桁数)回で開く?
#306 さいたま2008
No.306 さいたま2008 - yukicoder
対称移動した点から直線を引くと最短距離、っていう中学か高校でよくやるやつ。
xa, ya = map(int, raw_input().split()) xb, yb = map(int, raw_input().split()) p = ya + 1.0 * (yb - ya) * xa/(xb + xa) print p
こんな感じでした。
もうリアクティブ問題でも大丈夫