Problem:


Problem A: K Cards

ある日、先生は次のようなゲームを思いついた。

ゲームは 1 から 10 までの数がひとつ書かれたカードを n 枚使用し、以下のように進む。

先生が n 枚のカードを数が見えるようにして横一列に黒板に貼り付け、ある整数 k (k ≥ 1) を生徒に宣言する。横一列に並べられた n 枚のカードについて、連続した k 枚のカードの積の最大値を Ck とする。また、先生が並べた時点での Ck を Ck' とおく。

生徒は 1. で貼られたカードの列を見て Ck を大きくすることを考える。ある 2 枚を入れ替えることで Ck をより大きくすることができた場合、生徒の成績は Ck - Ck' 点上がる。誰かが成績点を得たらゲームを終了する。

あなたの仕事は先生が並べたカードの列を入力し、生徒が得られる最大の成績点を出力するプログラムを書くことである。ただし、そこからどの 2 枚を選んで交換してもCkを下げることしかできない (Ck - Ck' < 0) 場合、文字列 "NO GAME" (引用符を含まない)を出力せよ。

先生が並べたカードが7, 2, 3, 5の場合。このとき 7 と 3 を交換することで生徒は最大で 35 - 15 = 20 成績点を得る。

Input

入力は複数のテストケースからなる。ひとつのテストケースは以下の形式に従う。

n k
c1
c2
c3
…
cn

n は先生が並べるカードの枚数、k は宣言する整数である。
また ci (1 ≤ i ≤ n) はカードに書かれた数を示す。また、この順で先生が横に黒板に貼り付けるとする。入力の終わりは、ふたつの0が一文字の空白で区切られる一行で示される。

Constraints

入力はすべて整数

2 ≤n ≤ 100

1 ≤k ≤ 5

k ≤ n

1 ≤ ci ≤ 10 (1 ≤ i ≤ n)

テストケースの数は 100 を超えない。

Output

生徒が得られる成績点の最大値あるいは文字列 "NO GAME" (引用符を含まない)を各テストケースに付き 1 行で出力せよ。

Sample Input

4 2
2
3
7
5
0 0

Sample Output

0

Hint

サンプルにおいて C2' = 35 であり、ここからどの 2 枚を並び替えても C2 の最大値は 35 より大きくならない。したがって生徒が得られる成績点は最大 0 点である。



Sample input:
4 2
2
3
7
5
0 0


Sample output:
0

Submission status: Wrong Answer

Solution code:
while(1):
    [n,k]=[int(x) for x in raw_input().split()]
    if n==0: break
    clist=[]
    for i in range(n):
        clist.append(int(raw_input()))
    d1,d2=0,0
    for i in range(n-k+1):
        d1=max(reduce(lambda x,y:x*y,clist[i:i+k]),d1)
    for j in range(n-k+1):
        sect=sorted(clist[i:i+k])
        sect[0]=max(clist[:i]+clist[i+k:])
        d2=max(reduce(lambda x,y:x*y,sect),d2)
    print max(d2-d1,0)

Submission status: Wrong Answer

Solution code:
while True:
	cards_sum, cards_ind = map(int, input().split())
	if cards_sum == 0 and cards_ind == 0: break
	
	board = []
	for i in range(0, cards_sum):
		board.append(int(input()))
	print(board)
	
	inis = []
	for i in range(0, cards_sum - cards_ind + 1):
		ini = 1
		for ele in board[i: i + cards_ind]:
			ini *= ele
		inis.append(ini)
	ind_nun = inis.index(max(inis))
	print(inis)
	print(max(inis))
	print(ind_nun)
	
	groupA = []
	groupB = []
	for i in board[ind_nun: ind_nun + cards_ind + 1]:
		groupA.append(i)
	for i in board[0: ind_nun]:
		groupB.append(i)
	for i in board[ind_nun + cards_ind:]:
		groupB.append(i)
	print(groupA)
	print(groupB)
		
	if min(groupA) > max(groupB):
		print(0)
	else:
		print(int(max(inis) / min(groupA)) * (max(groupB) - min(groupA)))

Submission status: Wrong Answer

Solution code:
while True:
	cards_sum, cards_ind = map(int, input().split())
	if cards_sum == 0 and cards_ind == 0: break
	
	board = []
	for i in range(0, cards_sum):
		board.append(int(input()))
	
	inis = []
	for i in range(0, cards_sum - cards_ind + 1):
		ini = 1
		for ele in board[i: i + cards_ind]:
			ini *= ele
		inis.append(ini)
	ind_nun = inis.index(max(inis))
	
	groupA = []
	groupB = []
	for i in board[ind_nun: ind_nun + cards_ind + 1]:
		groupA.append(i)
	for i in board[0: ind_nun]:
		groupB.append(i)
	for i in board[ind_nun + cards_ind:]:
		groupB.append(i)
		
	if min(groupA) > max(groupB):
		print(0)
	else:
		print(int(max(inis) / min(groupA)) * (max(groupB) - min(groupA)))

Submission status: Wrong Answer

Solution code:
while True:
	cards_sum, cards_ind = map(int, input().split())
	if cards_sum == 0 and cards_ind == 0: break
	
	board = []
	for i in range(0, cards_sum):
		board.append(int(input()))
	
	inis = []
	for i in range(0, cards_sum - cards_ind + 1):
		ini = 1
		for ele in board[i: i + cards_ind]:
			ini *= ele
		inis.append(ini)
	ind_nun = inis.index(max(inis))
	
	groupA = []
	groupB = []
	for i in board[ind_nun: ind_nun + cards_ind + 1]:
		groupA.append(i)
	for i in board[0: ind_nun]:
		groupB.append(i)
	for i in board[ind_nun + cards_ind:]:
		groupB.append(i)
		
	if min(groupA) > max(groupB):
		print("NO GAME")
	else:
		print(int(max(inis) / min(groupA)) * (max(groupB) - min(groupA)))

Submission status: Wrong Answer

Solution code:
while 1:
	n,k = map(int,raw_input().split())
	if n == 0: break
	c = [int(raw_input()) for i in range(n)]
	Ck1 = 1
	for i in range(k):
		Ck1 *= c[i]
	Ck = Ck1*max(c[k:])/min(c[:k])
	cur1 = Ck1
	for i in range(k,n):
		cur1 = cur1*c[i]/c[i-k]
		cur2 = cur1*max(c[:i-k]+c[i+1:])/min(c[i-k+1:i+1])
		Ck1 = max(Ck1,cur1)
		CK = max(Ck,cur2)
	if n-k >= 2: Ck = max(Ck1,Ck)
	print Ck-Ck1 if Ck-Ck1 >= 0 else "NO GAME"

Submission status: Wrong Answer

Solution code:
while 1:
	n,k = map(int,raw_input().split())
	if n == 0: break
	c = [int(raw_input()) for i in range(n)]
	Ck1 = 1
	for i in range(k):
		Ck1 *= c[i]
	Ck = Ck1*max(c[k:])/min(c[:k]) if k < n else Ck1
	cur1 = Ck1
	for i in range(k,n):
		cur1 = cur1*c[i]/c[i-k]
		cur2 = cur1*max(c[:i-k+1]+c[i+1:])/min(c[i-k+1:i+1])
		Ck1 = max(Ck1,cur1)
		CK = max(Ck,cur2)
	if n-k >= 2: Ck = max(Ck1,Ck)
	print Ck-Ck1 if Ck-Ck1 >= 0 else "NO GAME"

Submission status: Accepted

Solution code:
while(1):
    [n,k]=[int(x) for x in raw_input().split()]
    if n==0: break
    clist=[]
    for i in range(n):
        clist.append(int(raw_input()))
    d1,d2=0,0
    for i in range(n-k+1):
        d1=max(reduce(lambda x,y:x*y,clist[i:i+k]),d1)
    for j in range(n-k+1):
        sect=sorted(clist[j:j+k])
        sect[0]=max(clist[:j]+clist[j+k:])
        d2=max(reduce(lambda x,y:x*y,sect),d2)
    print max(d2-d1,0)

Submission status: Accepted

Solution code:
from functools import reduce
from collections import Counter
while True:
  n, k = map(int, input().split())
  if n == 0:
    break
  clst = [int(input()) for _ in range(n)]
  acc = reduce(lambda x, y:x* y, clst[:k])
  scores = [acc]
  for i in range(n - k):
    acc = acc // clst[i] * clst[i + k]
    scores.append(acc)
  
  score = 0
  for i in range(n):
    for j in range(i + 1, n):
      p = clst[i]
      q = clst[j]
      for x in range(i - k + 1, i + 1):
        if abs(j - x) >= k and 0 <= x <= n - k:
          score = max(score, scores[x] // p * q)
      for x in range(j - k + 1, j + 1):
        if abs(x - i) >= k and 0 <= x <= n - k:
          score = max(score, scores[x] // q * p)
  if score < max(scores):
    print("NO GAME")
  else:
    print(score - max(scores))