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)