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

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

Codeforces Beta Round #77 (Div.2 Only)

はい。
http://codeforces.com/contest/96

A. Football

implementation,strings

ざっくりと大意

・サッカーでチーム0の選手やチーム1の選手たちがいる。同じチームの選手たちが少なくとも7人固まって並んでいると危険である。

Python2

n=raw_input()
print 'YES' if '1'*7 in n or '0'*7 in n else 'NO'

文字列で受け取って0か1が7個以上並んでいる箇所を探せば大丈夫だと思う。

B. Lucky Numbers (easy)

binary search,bitmasks,brute force

ざっくりと大意

・4と7だけで構成されたらラッキーナンバー。4と7の個数が同じなら超ラッキーナンバー。
・nが偶然それならそのまま、そうでなければnより大きく最もnに近い数を出力。

方針のようなもの

・奇数桁なら1桁補って先頭から4を優先で4477、偶数桁で7744より大きければ2桁補って444777。
・偶数桁で4477より小さければ4477。
・単純に定まらないのが偶数桁で4477より大きい時。 ・手書きで入れ替えは怠かったので順列で列挙してintキャストして比較。

Python2

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import time
import sys, io
import re, math
import itertools
#start = time.clock()
n=raw_input()
x=len(n)
sokushi=list(n)
if sokushi.count('4')==sokushi.count('7') and len(sokushi)==(sokushi.count('4')+sokushi.count('7')):
    print n
elif (x%2!=0) or (int(n)>int('7'*(x/2)+'4'*(x/2))):
    print '4'*(x/2+1)+'7'*(x/2+1)
elif int(n)<int('4'*(x/2)+'7'*(x/2)):
    print ('4'*(x/2)+'7'*(x/2))
else:
    jk=['4' for _ in range(x/2)]
    for i in range(x/2):
        jk.append('7')
    kari=[]
    for j in itertools.permutations(jk):
        kari.append(''.join(list(j)))
    kari=set(kari)
    kari=list(kari)
    kari.sort()
    for k in range(len(kari)):
        if int(n)<int(kari[k]):
            print kari[k]
            sys.exit()

ただこのpermutation使うのは大きい数を使うと辛くなるかな。大きな数でも対応できそうな解法は多分コレ
544013のlivingroomさん

a = [44,47,74,77]
n = int(raw_input())
que = [44,47,74,77]
while len(que) > 0:
    cur = que.pop(0)
    if cur >= n and str(cur).count('4') == str(cur).count('7'):
        print cur
        break
    for i in a :
        next = cur * 100 + i
        que.append(next)