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

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

Codeforces Round #190 (Div.2)

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

A. Ciel and Dancing

ざっくりと大意

・n人の少年とm人の少女で作れるダンスのペアをなんか列挙??

方針のようなもの

・単純な列挙ではなく順番も意味があるらしいので後で

B. Ciel and Flowers

ざっくりと大意

・r,g,bの花がある 単色でなら3本で1つの花束作成か3色1本ずつで1つの花束作成

方針のようなもの

・作成の優先は3色で作る方が楽だと思う。後は余る本数に注意。

l=map(int,raw_input().split())
f=0
if 0 not in l: f=1
ans=chk=min(l)
for i in range(3):
    l[i]-=chk
    ans+=l[i]/3
    l[i]=l[i]%3
if l.count(2)>1 and ans>0 and f==1:
    print ans+1
else:
    print ans

3色で作れる最大の花束はr,g,bのmin値、お後は他の色が3本以上余ってればそれで作れる花束を加算する。だがしかし元々が3色あって2色で2本余る時は実はもう1束多く作れたので1を足す。
3,5,5という数だった場合に単色での束を優先で考えると各色1束ずつで3束でg,bは2本ずつ余っている。3色での束を優先で考えるとmin値の3束を作ってg,bは2本ずつ余る。だがしかしこの2本ずつ余る場合の最善手は3色の花束を2つとg,bの花束を1つずつで4束作れる。単純に2本が2色で余ってたら+1をすると0,2,2の時にも1束作った計算にしてしまうので最初の花の数に0が含まれていないことを判定条件に加える。