11,808
社区成员




有一种棋子游戏,游戏中每个棋子上标有两个不超过 6 的正整数,且前一个数小于等于后一个数,例如 16
44
23
都是合法的棋子。因此,共有 21 种不同的棋子。
如果三个棋子至少满足以下条件之一,则称这三个棋子构成了一组搭子:
三个棋子完全相同,例如 25 25 25
;
三个棋子上标注的共六个数字恰好取遍了 1 到 6,例如 15 34 26
;
* 三个棋子上标注的数字中,某种数字出现了 5 次,例如 66 26 66
。
输入 $n$ 个棋子($n$ 是 3 的倍数),你需要将这些棋子分成 $n/3$ 组,并希望尽可能多的组恰好能成为一组搭子。求最优方案下能形成多少组搭子?
输入描述:
从标准输入读入数据。
每个输入文件含有多个输入数据,第一行包含两个整数,分别是输入数据的个数 $T$ 和 $n$(每个输入文件的多个输入数据的 $n$ 是相同的)。
接下来 $T$ 行,每行含有 $n$ 个元素,依次表示每个棋子。
输出描述:
输出到标准输出。
输出 $T$ 行,每行包含一个整数,表示答案。
输入样例:
plain<br/>3 9<br/>12 24 45 22 36 24 22 23 24<br/>12 24 45 22 36 24 22 23 25<br/>12 24 45 22 36 24 22 22 22<br/><br/>
输出样例:
plain<br/>3<br/>2<br/>3<br/><br/>
样例解释
对于第一个输入数据,可以分成 12 45 36 | 24 24 24 | 22 22 23
,形成 3 组搭子;
对于第二个输入数据,无论怎么分,最多只能形成 2 组搭子;
* 对于第三个输入数据,可以分成 12 45 36 | 24 22 22 | 24 22 22
,形成 3 组搭子。
def is_same(c1, c2, c3):
return c1 == c2 == c3
def is_full_set(c1, c2, c3):
all_numbers = {int(digit) for c in (c1, c2, c3) for digit in str(c)}
return all_numbers == {1, 2, 3, 4, 5, 6}
def is_five_occurrences(c1, c2, c3):
from collections import Counter
count = Counter()
for c in (c1, c2, c3):
count.update(str(c))
return any(v >= 5 for v in count.values())
def can_form_triplet(c1, c2, c3):
return is_same(c1, c2, c3) or is_full_set(c1, c2, c3) or is_five_occurrences(c1, c2, c3)
def backtrack(chess_pieces, used, current_count):
if all(used):
return current_count
max_count = 0
for i in range(len(chess_pieces)):
if used[i]:
continue
for j in range(i + 1, len(chess_pieces)):
if used[j]:
continue
for k in range(j + 1, len(chess_pieces)):
if used[k]:
continue
used[i] = used[j] = used[k] = True
new_count = current_count + (1 if can_form_triplet(chess_pieces[i], chess_pieces[j], chess_pieces[k]) else 0)
max_count = max(max_count, backtrack(chess_pieces, used, new_count))
used[i] = used[j] = used[k] = False
return max_count
def solve_test_case(chess_pieces):
n = len(chess_pieces)
used = [False] * n
return backtrack(chess_pieces, used, 0)
import sys
input = sys.stdin.read
data = input().strip().splitlines()
T, n = map(int, data[0].split())
results = []
for i in range(1, T + 1):
chess_pieces = list(map(int, data[i].split()))
result = solve_test_case(chess_pieces)
results.append(result)
for res in results:
print(res)