如何加强省市网站建设,购物网站商城策划,网络推广宣传,影视广告步骤1#xff1a;问题定义与分析 输入条件#xff1a; 整数n#xff1a;牌的数量整数max#xff1a;葫芦牌面值之和的上限数组array#xff1a;n张牌的牌面值 输出条件#xff1a; 两个整数组成的数组[a,b]#xff1a; a表示三张相同牌的牌面值b表示两张相同牌的牌面值如…步骤1问题定义与分析 输入条件 整数n牌的数量整数max葫芦牌面值之和的上限数组arrayn张牌的牌面值 输出条件 两个整数组成的数组[a,b] a表示三张相同牌的牌面值b表示两张相同牌的牌面值如果不存在符合条件的葫芦返回[0,0] 限制条件 牌面值规则A(1) 2 3 ... 10 J(11) Q(12) K(13)3×a 2×b ≤ max需要找到最大的有效组合先比较三张牌的大小再比较两张牌的大小 边界条件 输入数组中没有足够的相同牌组成葫芦所有可能的组合都超过max值输入数组为空或长度不足
步骤2算法设计与分析
最优解决方案贪心算法
统计每个牌面值出现的次数分别找出可以作为三张牌和两张牌的候选值对候选值排序后采用贪心策略寻找最优解
时间复杂度分析
统计频次O(n)排序候选值O(k log k)其中k为不同牌面值的数量寻找最优解O(k²) 总体时间复杂度O(n k² k log k)其中k ≤ 13
空间复杂度O(k)用于存储频次统计和候选值 #include algorithm
#include iostream
#include unordered_map
#include vector// 用于比较牌面大小的辅助函数
int getCompareValue(int card) {// A牌值为1在比较时应该是最大的return card 1 ? 14 : card;
}// 用于计算和的辅助函数
int getSumValue(int card) {// 计算和时使用原始值return card;
}
std::vectorint solution(int n, int max, const std::vectorint array) {// 特殊情况处理if (n 5) return {0, 0};// 统计频次std::unordered_mapint, int countMap;for (int card : array) {countMap[card];}// 收集候选值std::vectorint triples, pairs;for (const auto [card, count] : countMap) {// 注意一个牌面值如果出现4次既可以用作triple也可以用作pairif (count 3) {triples.push_back(card);}if (count 2) {pairs.push_back(card);}}// 验证是否有足够的候选值if (triples.empty() || pairs.empty()) {return {0, 0};}// 对候选值进行排序考虑A牌的特殊性auto compareCards [](int a, int b) {int valueA (a 1) ? 14 : a; // A牌特殊处理int valueB (b 1) ? 14 : b;return valueA valueB;};std::sort(triples.begin(), triples.end(), compareCards);std::sort(pairs.begin(), pairs.end(), compareCards);// 寻找最优组合int bestTriple 0, bestPair 0;for (int triple : triples) {for (int pair : pairs) {// 跳过使用同一个牌面值的情况if (triple pair) continue;// 检查是否满足最大值限制int sum 3 * triple 2 * pair;if (sum max) {// 找到一个有效组合bestTriple triple;bestPair pair;goto found; // 由于已排序第一个找到的就是最优解}}}found:return bestTriple 0 ? std::vectorint{bestTriple, bestPair} : std::vectorint{0, 0};
}
步骤4解题启发 值的二元性处理 分离比较逻辑和计算逻辑使用辅助函数明确区分不同场景下的值处理 排序策略的灵活运用 自定义比较函数处理特殊规则保持原始值用于计算约束 优化空间的发现 A牌的特殊性质提供了独特的优化机会在满足约束的同时最大化结果
金融交易系统: struct Transaction {double nominalValue; // 面值double tradingValue; // 交易值double getValueForRisk() {// 风险计算使用面值return nominalValue;}double getValueForTrading() {// 交易使用交易值return tradingValue;}
}; 商品定价系统: class Product {double costPrice; // 成本价double marketPrice; // 市场价double getPriceForInventory() {// 库存估值使用成本价return costPrice;}double getPriceForSale() {// 销售使用市场价return marketPrice;}
};