1 条题解

  • 1
    @ 2026-3-27 17:22:37

    1.暴力:枚举区间的左端点和右端点,然后再跑一遍区间,用 哈希表 或者 set 来记录区间内奇偶恒星的数量。

    时间复杂度O(n^3)不足以通过本题,怎么办呢?

    考虑[1,3]这个区间 我们是先枚举了[1,1],[1,2]了的 但是前面计算的没有用上 反而重复计算了

    所有我们可以只枚举区间的左端点i,定义ji和ou来计数,然后每个右端点j都更新答案,详细看代码

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long  
    int n, ans;           
    int s[2010];        
    signed main(){
        cin >> n;
        // 输入数组
        for(int i = 1; i <= n; i++){
            cin >> s[i];
        }
        // 枚举子数组左端点i
        for(int i = 1; i <= n; i++){
            unordered_set<int> ji, ou;  // 去重存储:奇数、偶数
            int o = 0, p = 0;           // o:不同奇数数量,p:不同偶数数量
            // 枚举子数组右端点j(从i开始向右扩展)
            for(int j = i; j <= n; j++){
                if(s[j] % 2 == 0){  // 当前元素是偶数
                    if(ou.count(s[j]) == 0) p++;  // 未出现过,计数+1
                    ou.insert(s[j]);              // 插入集合去重
                }
                if(s[j] % 2 == 1){  // 当前元素是奇数
                    if(ji.count(s[j]) == 0) o++;  // 未出现过,计数+1
                    ji.insert(s[j]);              // 插入集合去重
                }
                // 核心条件:不同偶数数量 = 不同奇数数量
                if(o == p){
                    int all = ji.size() + ou.size();  // 总不同数字数
                    ans = max(ans, all);              // 更新最大值
                }
            }
        }
        cout << ans;
        return 0;
    }
    
    • 1

    信息

    ID
    748
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    227
    已通过
    49
    上传者