Problem:


Problem D: The Great Summer Contest

現在、人々の娯楽はプログラミングコンテストに限られている。彼女が所属しているとある中学校の娯楽部の活動内容は、プログラミングコンテストを企画し運営することだ。彼女の仕事は問題を作成することではない。多くの人から問題を募り、審判団を組織し、またコンテストの宣伝を行う、いわば裏方のお仕事だ。カリスマ作題者や著名なアルゴリズマーと違い、そういった仕事をする人に光が当たることはほとんどない。存在感はないけれども欠かすことのできないその仕事に、彼女は誇りを持って取り組んでいた。

娯楽部は常に問題を募集しているが、それらの問題は以下の 6 種類に分類される。

Math

Greedy

Geometry

DP

Graph

Other

幸いにも多くの問題が集まったので、彼女はたくさんコンテストを開こうと考えた。コンテストは 3 問の問題からなるが、彼女はコンテストがより教育的になるようにと、以下の 4 種類のコンテストを開くことに決めた。

  
数学ゲーコンテスト: Math の問題と DP の問題合わせて3問の問題セット

  
アルゴリズムゲーコンテスト: Greedy の問題と Graph の問題合わせて3問の問題セット

  
実装ゲーコンテスト: Geometry の問題と Other の問題合わせて3問の問題セット

  
バランスの良いコンテスト: Math または DP から 1 問、Greedy または Graph から 1 問、Geometry または Other から 1 問、合わせて3問の問題セット

もちろん、あるコンテストに出題した問題は他のコンテストに出題することはできない。彼女の望みは、できるだけ多くのコンテストを開くことだ。6 種類の問題のストック数は分かっているが、さて、最大何回コンテストを開けるだろうか。彼女にとってこれは難しい問題だが、カリスマアルゴリズマーであるあなたなら解決できるはずだ。

Input

入力は複数のケースからなる。
各ケースは以下のフォーマットで与えられる。

nMath nGreedy nGeometry nDP nGraph nOther

各入力の値はそれぞれの種類の問題のストックの数を表す。

入力の終わりは

0 0 0 0 0 0

からなる行によって与えられる。

各値は以下の条件を満たす。

nMath + nGreedy + nGeometry + nDP + nGraph + nOther ≤ 100,000,000

またテストケースの数は20,000個を超えない。

Output

開催可能なコンテストの最大数を1行に出力せよ。

Sample input

1 1 1 1 1 1
1 1 1 0 0 0
1 0 0 0 1 1
3 0 0 3 0 0
3 1 0 1 3 1
1 2 0 2 0 1
0 0 1 1 0 3
1 0 0 1 1 0
0 0 0 0 0 0

Sample output

2
1
1
2
3
1
1
0

The University of Aizu Programming Contest 2011 Summer

原案: Tomoya Sakai

問題文: Takashi Tayama



Sample input:
1 1 1 1 1 1
1 1 1 0 0 0
1 0 0 0 1 1
3 0 0 3 0 0
3 1 0 1 3 1
1 2 0 2 0 1
0 0 1 1 0 3
1 0 0 1 1 0
0 0 0 0 0 0


Sample output:
2
1
1
2
3
1
1
0

Submission status: Wrong Answer

Solution code:
# AOJ 1077: The Great Summer Contest
# Python3 2018.7.10 bal4u

while True:
	n, k, f = [0]*3, [0]*3, [0]*3
	a = list(map(int, input().split()))
	if sum(a) == 0: break
	for i in range(3): n[i] += a[i]+a[3+i]
	ans = 0
	for i in range(3):
		if n[i] >= 3: f[i] = 1
		ans += n[i]//3
		n[i] %= 3
		k[n[i]] += 1
	if k[0] > 0:
		if k[2] == 2:
			for i in range(3):
				if n[i] == 0: break
				if f[i]: ans += 1
	elif k[1] > 0: ans += 1
	elif k[2] > 0: ans += 2
	print(ans)

Submission status: Wrong Answer

Solution code:
while(1):
    inp=[int(x) for x in raw_input().split()]
    if sum(inp)==0: break
    A=[inp[0]+inp[3],inp[1]+inp[4],inp[2]+inp[5]]
    a=sum([x/3 for x in A])
    b=sum([(x-1)/3 for x in A])+1
    c=sum([(x-2)/3 for x in A])+2
    print max(a,b,c)

Submission status: Wrong Answer

Solution code:
while 1:
    math,greed,geo,dp,graph,other = map(int,raw_input().split())
    md,gg,go = math+dp,greed+graph,geo+other
    if md == gg == go == 0: break
    count = min(md/3,gg/3,go/3)
    md -= 3*count; gg -= 3*count; go -= 3*count
    print count + md/3 + gg/3 + go/3 + min(md%3,gg%3,go%3)

Submission status: Wrong Answer

Solution code:
while 1:
	N = map(int,raw_input().split())
	if sum(N) == 0: break
	md,gg,go = N[0]+N[3],N[1]+N[4],N[2]+N[5]
	low = min(md,gg,go)
	if low < 3:
		md -= low; gg -= low; go -= low
	count = min(md/3,gg/3,go/3)
	md -= 3*count; gg -= 3*count; go -= 3*count
	print low + count + md/3 + gg/3 + go/3 + min(md%3,gg%3,go%3)

Submission status: Wrong Answer

Solution code:
while 1:
	N = map(int,raw_input().split())
	if sum(N) == 0: break
	md,gg,go = N[0]+N[3],N[1]+N[4],N[2]+N[5]
	ans = md/3 + gg/3 + go/3
	md -= md/3*3; gg -= gg/3*3; go -= go/3*3
	ans += min(md%3,gg%3,go%3)
	print ans

Submission status: Time Limit Exceeded

Solution code:
while 1:
    math,greed,geo,dp,graph,other = map(int,raw_input().split())
    md,gg,go = math+dp,greed+graph,geo+other
    if md == gg == go == 0: break
    count = 0
    while md > 2 and gg > 2 and go > 2:
        md -= 1; gg -= 1; go -= 1
        count += 1
    print count + md/3 + gg/3 + go/3 + min(md%3,gg%3,go%3)

Submission status: Accepted

Solution code:
# AOJ 1077: The Great Summer Contest
# Python3 2018.7.10 bal4u

while True:
	n, k, f = [0]*3, [0]*3, [0]*3
	a = list(map(int, input().split()))
	if sum(a) == 0: break
	for i in range(3): n[i] += a[i]+a[3+i]
	ans = 0
	for i in range(3):
		if n[i] >= 3: f[i] = 1
		ans += n[i]//3
		n[i] %= 3
		k[n[i]] += 1
	if k[0] > 0:
		if k[2] == 2:
			i = 0
			while n[i]: i += 1
			if f[i]: ans += 1
	elif k[1] > 0: ans += 1
	elif k[2] > 0: ans += 2
	print(ans)

Submission status: Accepted

Solution code:
while 1:
	N = map(int,raw_input().split())
	if sum(N) == 0: break
	a,b,c = N[0]+N[3],N[1]+N[4],N[2]+N[5]
	m = min(a,b,c)
	ans = 0
	for i in range(max(0,m-2),m+1):
		ans = max(ans,i+(a-i)/3+(b-i)/3+(c-i)/3)
	print ans

Submission status: Accepted

Solution code:
while True:
  ns = list(map(int, input().split()))
  if not any(ns):
    break
  a = ns[0] + ns[3]
  b = ns[1] + ns[4]
  c = ns[2] + ns[5]
  av, ar = a // 3, a % 3
  bv, br = b // 3, b % 3
  cv, cr = c // 3, c % 3
  if max(ar, br, cr) == 0:
    print(av + bv + cv)
  elif max(ar, br, cr) == 1:
    print(av + bv + cv + min(ar, br, cr))
  elif max(ar, br, cr) == 2:
    if [ar, br, cr].count(2) == 3:
      print(av + bv + cv + 2)
    elif [ar, br, cr].count(2) == 2:
      for xr, xv in ((ar, av), (br, bv), (cr, cv)):
        if xr == 2:
          continue
        if xv == 0:
          print(av + bv + cv + xr)
        else:
          print(av + bv + cv + 1)
        break
    else:
      print(av + bv + cv + min(ar, br, cr))

Submission status: Runtime Error

Solution code:
while 1:
	N = map(int,raw_input().split())
	if sum(N) == 0: break
	md,gg,go = N[0]+N[3],N[1]+N[4],N[2]+N[5]
	mn = min(md,gg,go)
	ans = 0
	for i in range(max(0,w-2),w):
		ans = max(ans,i+(md-i)/3+(gg-i)/3+(go-i)/3)
	print ans