酷代码 AI
菜单
服务商

题目背景 “2048”是一个经典有趣的小游戏,基本玩法就是让两个 2 k 2 k 合成一个 2 k + 1 2 k+1 ,最终尽可能生成更大的数( k k 为正整数)。 题目描述 在本题中,给定了一个有 n n 个数的线性区间。 第 i i 个数为 a i a i ​ ,且一定是 2 2 的正整数次幂。 相邻两个相同的数 2 k 2 k 可以生成一个 2 k + 1 2 k+1 ,其中 k k 为正整数。 现在你需要求出可以生成的最大的数,特别地,原区间内已有的数也在答案统计范围内。 输入格式 本题包含多组测试数据。 第一行一个整数 T T,即数据组数。 对于每组数据输入 2 2 行: 第一行一个整数 n n,即数的数量。 第二行 n n 个整数,即区间内的 a i a i ​ 。 输出格式 对于每组数据: 输出一行一个整数,即最大可能生成的数。 输入输出样例 #1 输入 #1 复制 2 5 2 2 2 4 2 10 8 4 2 2 4 8 8 8 2 2 输出 #1 复制 8 32 说明/提示 测试点编号

以下是解决此问题的 C++ 代码: ```cpp #include <iostream> #include <vector> // 合并相邻相同的数 std::vector<long long> merge(std::vector<long long> nums) { bool merged = true; while (merged) { merged = false; for (int i = 0; i < nums.size() - 1; ++i) { if (nums[i] == nums[i + 1]) { // 合并相邻相同的数 nums[i] *= 2; // 移除第二个相同的数 nums.erase(nums.begin() + i + 1); merged = true; } } } return nums; } // 找到数组中的最大值 long long findMax(const std::vector<long long>& nums) { long long maxVal = 0; for (long long num : nums) { if (num > maxVal) { maxVal = num; } } return maxVal; } int main() { int T; std::cin >> T; for (int t = 0; t < T; ++t) { int n; std::cin >> n; std::vector<long long> nums(n); for (int i = 0; i < n; ++i) { std::cin >> nums[i]; } // 合并相邻相同的数 std::vector<long long> mergedNums = merge(nums); // 找到合并后数组中的最大值 long long maxNum = findMax(mergedNums); std::cout << maxNum << std::endl; } return 0; } ``` 代码解释 1. `merge` 函数:该函数用于合并相邻相同的数。使用一个 `while` 循环,只要有合并操作发生,就继续循环。在每次循环中,遍历数组,找到相邻相同的数,将它们合并为一个数,并移除第二个相同的数。 2. `findMax` 函数:该函数用于找到数组中的最大值。遍历数组,记录最大值并返回。 3. `main` 函数:首先读取测试数据的组数 `T`。对于每组数据,读取数的数量 `n` 和数组元素。调用 `merge` 函数合并相邻相同的数,再调用 `findMax` 函数找到合并后数组中的最大值,并输出结果。 额外需要注意的逻辑点 1. 在 `merge` 函数中,每次合并操作后,数组的长度会发生变化,因此需要注意循环的边界条件。 2. 由于 `a_i` 的最大值可能达到 `2^40`,因此需要使用 `long long` 类型来存储数组元素,避免溢出。 3. 在 `merge` 函数中,使用 `erase` 函数移除元素时,要确保移除的元素是正确的,避免移除错误的元素。 [2025-07-28 14:31:25 | AI写代码神器 | 692点数解答]

相关提问
请收藏新域名:pdcd.cn
发财导航,免费问AI
实用工具查看更多
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]
数独游戏 [娱乐类]
经典推箱子 [娱乐类]
AI摸鱼五子棋 [娱乐类]