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

题目描述 给定一个长为 𝑛 n 的序列 𝑎 1 , 𝑎 2 , 𝑎 3 , … , 𝑎 𝑛 a 1 ​ ,a 2 ​ ,a 3 ​ ,…,a n ​ ,你需要执行 𝑘 k 次操作使这个序列为空。 每次操作可以执行下列内容之一: 选择两个数 𝑖 , 𝑗 i,j,交换 𝑎 𝑖 , 𝑎 𝑗 a i ​ ,a j ​ (需要满足 1 ≤ 𝑖 < 𝑗 ≤ 𝑛 1≤i<j≤n)。 选择两个数 𝑖 , 𝑗 i,j,删除 𝑎 𝑖 , 𝑎 𝑖 + 1 , … , 𝑎 𝑗 a i ​ ,a i+1 ​ ,…,a j ​ (需要满足 1 ≤ 𝑖 ≤ 𝑗 ≤ 𝑛 1≤i≤j≤n,且 𝑎 𝑖 = 𝑎 𝑗 a i ​ =a j ​ )。 请输出最小的操作数 𝑘 k。 输入格式 第一行输入一个正整数 𝑇 t( 1 ≤ 𝑇 ≤ 5 1≤t≤5),表示有 𝑇 t 个测试数据。 对于每个测试数据: 第一行输入一个正整数 𝑛 n( 1 ≤ 𝑛 ≤ 1 0 5 1≤n≤10 5 ),表示序列长度为 𝑛 n。 第二行输入 𝑛 n 个正整数 𝑎 1 , 𝑎 2 … 𝑎 𝑛 a 1 ​ ,a 2 ​ …a n ​ ( 0 ≤ 𝑎 𝑖 ≤ 1 0 9 0≤a i ​ ≤10 9 )。 输出格式 对于每个测试数据输出一个正整数 𝑘 k,表示最少的操作次数,语言方向:C++

以下是使用 C++ 编写的解决此问题的代码: ```cpp #include <iostream> #include <vector> // 函数用于计算最少操作次数 int minOperations(std::vector<int>& nums) { int n = nums.size(); int opCount = 0; // 标记已处理的元素 std::vector<bool> processed(n, false); for (int i = 0; i < n; ++i) { if (!processed[i]) { for (int j = i + 1; j < n; ++j) { if (nums[i] == nums[j]) { processed[j] = true; } } opCount++; } } return opCount; } int main() { int t; std::cin >> t; while (t--) { int n; std::cin >> n; std::vector<int> nums(n); for (int i = 0; i < n; ++i) { std::cin >> nums[i]; } int k = minOperations(nums); std::cout << k << std::endl; } return 0; } ``` 注意点: 1. 输入数据的范围要严格控制,确保输入的正整数在规定范围内。 2. 处理标记已处理元素的逻辑,防止重复计算。 3. 输出结果要符合题目要求的格式。 [2024-12-21 16:23:07 | AI写代码神器 | 346点数解答]

相关提问