1 条题解

  • 0
    @ 2026-2-20 13:55:23
    #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;
    }
    
    • 1

    信息

    ID
    1472
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者