1 条题解
-
1
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; }
信息
- ID
- 748
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 227
- 已通过
- 49
- 上传者