Codeforces Beta Round #9 (Div. 2 Only)
はい。
A. Die Roll
math,probabilities
ざっくりと大意
・なんかプレイヤー?含む3人でサイコロを振ってゲームをしている。
・目の大きいのが勝利。
・他の人と同じ目なら勝利を譲ってもらえる。
方針のようなもの
・他の2人とか大きいの方の目とだけ比較すればいいかな。
・他の2人共が6でもプレイヤーが6を出せば勝利を譲ってもらえるなら、勝つ可能性が0/1になる場面は発生しないんじゃないかな。
a,b=map(int, raw_input().split()) if max(a,b)==6: print "1/6" elif max(a,b)==5: print "1/3" elif max(a,b)==4: print "1/2" elif max(a,b)==3: print "2/3" elif max(a,b)==2: print "5/6" else: print "1/1"
素直に全てをif分岐で。
だがコレ実は一行で書けたようです。
4049021のE478さん。
print [0, '1/1', '5/6', '2/3', '1/2', '1/3', '1/6'][max(map(int, raw_input().split()))]
こういうのをさらっと思いつくようになりたいな。。。
C. Hexadecimal's Numbers
math
ざっくりと大意
・1からnまでに1,0のみで構成されてる整数が何個あるか?
方針のようなもの
・とりあえず1からnまで1ずつ加算して、1,0のみでの公正ではないかをチェックした。
・が、流石に無駄が多すぎてTLEになった。
・1,0のみでの構成の発生する周期が・・10,11,100,101,110,111,1000・・
・下桁に1が並ぶと大きい桁に繰り上がるまで一気に加算して大丈夫っぽい?
#!/usr/bin/env python # -*- coding: UTF-8 -*- import time import sys, io import re, math start = time.clock() n=int(raw_input()) i=1 ans=0 x=1 #どうしたらいいかわからなかったらとりあえずwhile 1:ループ while 1: #数え上げが上限のnをこえたら終了 if i >n: break #strにキャストして文字数(桁数)と1,0の個数の和が等しければ1,0のみで構成かな? if len(str(i))==(str(i).count("0") + str(i).count("1")): ans+=1 #下桁が1並びでないかチェックして並びに応じて一気に加算 if str(i)[-1:]=="1": x=9 if str(i)[-2:]=="11": x=89 if str(i)[-4:]=="1111": x=8889 if str(i)[-5:]=="11111": x=88889 if str(i)[-6:]=="111111": x=888889 if str(i)[-7:]=="1111111": x=8888889 if str(i)[-8:]=="11111111": x=88888889 #一気に大きい数字を加算して大きくなりすぎても判定させる箇所があるので大丈夫だと思う else: x=1 i+=x print ans
一回目のACからちょっと書きなおしたものです。一回目までは文法ミスだったり、111・・・を''で囲み忘れてたりとか色々酷かった。 多分コレが1から素直に数えつつ飛ばせるところは飛ばずという直感的な思いつきに一番近い方法ではないかなと。
他の方の解法では
2353872のrotsen24154さん。
n, x, z = raw_input(), 0, '0' for c in n: x = (x << 1) + (c > '0' or z > '1') z = max(z, c) print x
4049778のE478さん。enumerate使用して
s = raw_input() for i, c in enumerate(s): if c > '1': s = s[:i] + '1' * (len(s) - i) break print int(s, 2)
1377953のSamanSamiさん。binで置換して
10進数で1,0のみの構成になる数とそれ以外とで何か違いの法則あるのかな。
n=int(raw_input()) i=1 c=0 while int(bin(i)[2:],10)<=n: c+=1 i+=1 print c
他にもラムダ式使ってる人もいたっぽい。複数の方法がありかなりいい問題だったんじゃなかろうか。
あと一応は外部で予め計算しておいて、1<n<9なら1、10なら2、11<n<99なら3とか与えられるnによっていくつを返すか決めておく方法でも多分通ると思う。多分。