#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 检查4张牌中是否能找到两个不相交的集合,它们的点数和相等
// 返回 {取出的牌数, 点数总和}
pair<int, int> findBestSolution(vector<int>& cards) {
int maxCards = 0;
int maxSum = 0;
// 枚举所有可能的子集组合
for (int mask1 = 1; mask1 < 16; mask1++) { // 从1到15,表示非空子集
for (int mask2 = 1; mask2 < 16; mask2++) {
// 两个集合不能有重叠
if (mask1 & mask2) continue;
int sum1 = 0, sum2 = 0;
int cnt1 = 0, cnt2 = 0;
// 计算第一个集合的点数和
for (int i = 0; i < 4; i++) {
if (mask1 & (1 << i)) {
sum1 += cards[i];
cnt1++;
}
}
// 计算第二个集合的点数和
for (int i = 0; i < 4; i++) {
if (mask2 & (1 << i)) {
sum2 += cards[i];
cnt2++;
}
}
// 检查点数和是否相等
if (sum1 == sum2) {
int totalCards = cnt1 + cnt2;
int totalSum = sum1 + sum2; // 或者 sum1 * 2
// 优先选择牌数多的方案
if (totalCards > maxCards) {
maxCards = totalCards;
maxSum = totalSum;
}
// 牌数相同时选择点数总和大的方案
else if (totalCards == maxCards && totalSum > maxSum) {
maxSum = totalSum;
}
}
}
}
return {maxCards, maxSum};
}
int main() {
int n;
cin >> n;
vector<int> deck(n);
for (int i = 0; i < n; i++) {
cin >> deck[i];
}
// 反转牌堆,使其从栈顶到栈底(便于操作)
reverse(deck.begin(), deck.end());
int totalRemoved = 0;
while (deck.size() >= 4) {
// 取出栈顶的4张牌
vector<int> currentCards;
for (int i = 0; i < 4; i++) {
currentCards.push_back(deck.back());
deck.pop_back();
}
// 寻找最佳解决方案
auto result = findBestSolution(currentCards);
int cardsToRemove = result.first;
// 如果没有找到解决方案,游戏结束
if (cardsToRemove == 0) {
break;
}
totalRemoved += cardsToRemove;
// 标记要移除的牌
vector<bool> removed(4, false);
int bestMask1 = 0, bestMask2 = 0;
int bestCards = 0, bestSum = 0;
// 重新寻找最佳组合来标记要移除的牌
for (int mask1 = 1; mask1 < 16; mask1++) {
for (int mask2 = 1; mask2 < 16; mask2++) {
if (mask1 & mask2) continue;
int sum1 = 0, sum2 = 0;
int cnt1 = 0, cnt2 = 0;
for (int i = 0; i < 4; i++) {
if (mask1 & (1 << i)) {
sum1 += currentCards[i];
cnt1++;
}
if (mask2 & (1 << i)) {
sum2 += currentCards[i];
cnt2++;
}
}
if (sum1 == sum2) {
int totalCards = cnt1 + cnt2;
int totalSum = sum1 + sum2;
if (totalCards > bestCards ||
(totalCards == bestCards && totalSum > bestSum)) {
bestCards = totalCards;
bestSum = totalSum;
bestMask1 = mask1;
bestMask2 = mask2;
}
}
}
}
// 标记要移除的牌
for (int i = 0; i < 4; i++) {
if ((bestMask1 & (1 << i)) || (bestMask2 & (1 << i))) {
removed[i] = true;
}
}
// 将未移除的牌按原顺序放回牌堆(从后往前放回)
for (int i = 3; i >= 0; i--) {
if (!removed[i]) {
deck.push_back(currentCards[i]);
}
}
}
cout << totalRemoved << endl;
return 0;
}