酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

题目描述 给定一个长为 nn 的序列 a_1, a_2,a_3, \dots ,a_na 1 ​ ,a 2 ​ ,a 3 ​ ,…,a n ​ ,你需要执行 kk 次操作使这个序列为空。 每次操作可以执行下列内容之一: 选择两个数 i, ji,j,交换 a_i, a_ja i ​ ,a j ​ (需要满足 1 \le i < j \le n1≤i<j≤n)。 选择两个数 i, ji,j,删除 a_i,a_{i+1}, \dots ,a_ja i ​ ,a i+1 ​ ,…,a j ​ (需要满足 1 \le i \le j \le n1≤i≤j≤n,且 a_i = a_ja i ​ =a j ​ )。 请输出最小的操作数 kk。 输入格式 第一行输入一个正整数 tt(1 \le t \le 51≤t≤5),表示有 tt 个测试数据。 对于每个测试数据: 第一行输入一个正整数 nn(1 \le n \le 10^51≤n≤10 5 ),表示序列长度为 nn。 第二行输入 nn 个正整数 a_1,a_2 \dots a_na 1 ​ ,a 2 ​ …a n ​ (0 \le a_i \le 10^90≤a i ​ ≤10 9 )。 输出格式 对于每个测试数据输出一个正整数 kk,表示最少的操作次数。 输入输出样例 输入 #1 复制 2 5 1 2 3 2 3 3 1000000000 1000000000 99999999 输出 #1 复制 2 2 说明/提示 数据范围 子任务 分值 限制 11 1010 n\le 3n≤3 22 2020 n\le 10n≤10 33 2020 a_i\le 2a i ​ ≤2 44 1010 保证所有 a_ia i ​ 相等 55 4040 - 对于 100\%100% 的数据,1\le t \le 51≤t≤5,1\le n\le 10^51≤n≤10 5 ,0\le a_i\le 10^90≤a i ​ ≤10 9 。,语言方向:C++,系统环境:Windows

```cpp #include <iostream> #include <vector> #include <unordered_map> using namespace std; int minOperationsToEmptyArray(int n, const vector<int>& a) { unordered_map<int, int> countMap; for (int num : a) { countMap[num]++; } // 记录最大连续相同元素长度 int maxConsecutive = 0; int currentConsecutive = 1; for (int i = 1; i < n; ++i) { if (a[i] == a[i - 1]) { currentConsecutive++; } else { maxConsecutive = max(maxConsecutive, currentConsecutive); currentConsecutive = 1; } } maxConsecutive = max(maxConsecutive, currentConsecutive); // 如果存在超过2个的连续相同元素,直接返回这些元素的数量除以2向上取整 if (maxConsecutive > 2) { return (n + 1) / 2; } // 如果所有元素都不同或者最多有两个连续相同的元素 int uniqueElements = countMap.size(); if (uniqueElements == n) { return n - 1; } else { return uniqueElements; } } int main() { int t; cin >> t; while (t--) { int n; cin >> n; vector<int> a(n); for (int& num : a) { cin >> num; } cout << minOperationsToEmptyArray(n, a) << endl; } return 0; } ``` 代码 - 使用 `unordered_map` 统计每个元素出现次数。 - 遍历数组,记录最大连续相同元素长度。 - 根据最大连续相同元素长度判断操作次数。 - 对于测试用例,循环读入数据并输出结果。 额外需要注意的地方: 1. 输入数据量较大时,使用快速读写方法优化性能。 2. 处理边界情况,如数组长度为1或所有元素相同。 3. 考虑到内存限制,避免不必要的空间开销。 [2024-12-21 17:35:25 | AI写代码神器 | 462点数解答]

相关提问