読者です 読者をやめる 読者になる 読者になる

君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

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によっていくつを返すか決めておく方法でも多分通ると思う。多分。