Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
#include
#include
#include
using namespace std; // 检查4张牌中是否能找到两个不相交的集合,它们的点数和相等 // 返回 {取出的牌数, 点数总和} pair
findBestSolution(vector
& 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
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
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
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; }
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)