本文主要是介绍codeforces 1208B Uniqueness,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:Problem - B - Codeforces
题意:
删除某一段最小长度的连续子序列,使得剩余的序列中不存在重复元素
错误解题思路:
分情况讨论,4种方法
1.删除序列左边的子序列
2.删除序列右边的子序列
3.删除中间的子序列
(1)先从前往后查找到重复元素,再从后往前取没有重复的元素
(2)先从后往前查找到重复元素,再从前往后取没有重复的元素
错误代码:
wa在了第54个测试用例
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;int main(){int n;cin >> n;int l = 1, r = n, ans = 100005;int a[2005];map<int, int> mp, mpb;for(int i = 1; i <= n; i++) {cin >> a[i];}for(int i = 1; i <= n; i++) {mp[a[i]]++;if(mp[a[i]] > 1) {l = i;ans = min(ans, n - l + 1); // 从左往右// cout << "ans1 = "<< ans << " n = " << n << " l=" << l << endl;for(int j = n; j > i; j--) {mp[a[j]]++;if(mp[a[j]] > 1) {ans = min(ans, j - l + 1); // 从右往左,获取没有重复的元素// cout << "ans2 = "<< ans << endl;break;}}break;}}for(int i = n; i > 0; i--) {mpb[a[i]]++;if(mpb[a[i]] > 1) {r = i;ans = min(ans, r); // 从右往左// cout << "ans3 = "<< ans << " n = " << n << " r=" << r << endl;for(int j = 1; j <= i; j++) {mpb[a[j]]++;if(mpb[a[j]] > 1) {ans = min(ans, r - j + 1); // 从左往右,获取没有重复的元素// cout << "ans4 = "<< ans << endl;break;}}break;}}if(ans == 100005) {ans = 0;}cout << ans << endl;return 0;
}
欢迎大佬指教错误啊
这篇关于codeforces 1208B Uniqueness的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!