1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int n;// [1] n-存储观测的恒星总数量 int arr[2100];// [2] arr-存储每颗恒星对应的行星数量,适配题目n≤2000的上限 int flag[100100];// [3] flag-标记数组,记录行星数量是否在当前区间出现,适配s_i≤1e5的上限 int main(){ // [4] 读入观测的恒星总数量n cin >> n; // [5] 循环读入n颗恒星的行星数量,存入arr数组 for(int i = 1 ; i <= n ; i++) { cin >> arr[i]; } int max_len = 0;// [6] max_len-存储最终答案,即符合条件的最大不同恒星数量 // [7] 外层循环:枚举所有连续区间的左端点i,遍历所有可能的区间起点 for(int i = 1 ; i <= n ; i++) { int odd = 0, even = 0;// [8] odd-当前区间去重后的奇恒星数量,even-当前区间去重后的偶恒星数量 vector<int> brr;// [9] brr-记录当前区间出现过的行星数量,用于后续重置flag标记 // [10] 内层循环:枚举连续区间的右端点j,扩展区间,遍历所有以i为起点的区间 for(int j = i ; j <= n ; j++) { // [11] 判断当前行星数量是否在本区间首次出现,仅首次出现时参与统计 if(!flag[arr[j]]) { brr.push_back(arr[j]);// 记录当前行星数量,用于后续重置标记 flag[arr[j]] = 1;// 标记该行星数量已在当前区间出现,避免重复统计 // 按行星数量的奇偶性更新对应计数 if(arr[j] & 1) odd++;// 行星数量为奇数,奇恒星计数+1 else even++;// 行星数量为偶数,偶恒星计数+1 } // [12] 判断当前区间是否符合题目要求:去重后奇偶恒星数量相等 if(odd == even) max_len = max(max_len , odd + even);// 更新最大不同恒星数量,总数量为去重后奇偶恒星数之和 } // [13] 重置当前区间用过的flag标记,为下一轮左端点枚举做准备 for(int j = 0 ; j < brr.size() ; j++) flag[brr[j]] = 0;// 清除对应行星数量的出现标记 } cout << max_len;// [14] 输出最终计算得到的答案 return 0; }
信息
- ID
- 1472
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者