题目链接:https://codeforces.com/contest/1208/problem/B
思路:题目最终达到效果是剩下的数相互不重复,假设整个序列有k个数多余,于是选一段连续的区间,这段区间如果包含了这k个数就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2005;
int a[maxn];
map <int , int> mp;
int main() {
int n;
ios::sync_with_stdio(0);
cin >> n;
int cnt = 0;
for(int i = 0 ; i < n ; i++) {
cin >> a[i];
if(mp.count(a[i]))cnt++;
mp[a[i]]++;
}
if(cnt == 0)cout << 0 << "\n";
else {
int ans = 0x7f7f7f7f;
for(int i = 0 ; i < n ; i++) {
int k = 0;
map <int , int> vis;
for(int j = i ; j < n ;j++) {
if(mp[a[j]] >= 2) {
vis[a[j]]++;
if(vis[a[j]] < mp[a[j]]) k++;
if(k >= cnt) {
ans = min(ans , j - i + 1);
break;
}
}
}
}
cout << ans << "\n";
}
return 0;
}