题目链接:B. Uniqueness

题意:n (1 - 2000) 个数,只删除一个子串使得数组中没有重复元素,求删除的子串长度。

思路(参考博客cf1208B B. Uniqueness):
逆向考虑问题,要删除的最少区间长度对应最多能保留多少个数,又因为区间要是连续的,所以只能删除左端区间,或中区间,或右边区间。利用两个map,第一个存从左往右能保留的每个元素的下标,并用一个数记录最终下标;第二个map从右往左扫描,用于记录当前元素的右半部分能保留多少数,如果出现与其右部分的重复元素,则计算其中间要删除的元素个数,并判断是否要更新答案,否则进行标记,若当前右半部分的元素与一开始左半部分的元素,则模拟对左半部分元素删除操作,同时更新删除元素个数找出最佳答案,具体情况看代码和注释。

暴力的话直接枚举所有可能的长度,二分的话就是二分可能的长度,就是再暴力的基础上多了一点优化。

原博主代码:

#include <bits/stdc++.h>
using namespace std;
map<int, int > book1, book2;
int main() {int n;int a[2005];scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);}int ans = 99999;// p记录左半部分能保留数字的下标(即个数), q记录右半部分能保留到的下标,q-p则为要删除的序列的大小 int p = 1, q = n; // 从左往右扫描,记录从左往右能保留多少个数,即遇到重复数字停止扫描 while (p <= n) {if (book1[a[p]]) {break;} else {book1[a[p]] = p;}p++;}// 由于扫描的时候是判断下一位,所以p要减一才是实际最后那个不重复元素的下标(个数) p--;ans = n - p; // 此时要删除的元素为元素总个数减去前左半部分要保留的数字 // 从右往左扫描 while (q >= 1) {if (book2[a[q]]) { // 如果q右半部分的数字在左半部分没出现过,但q右半部分的数字出现重复,则进行判断后结束扫描 if (ans > q - p) ans = q - p; // 如果此时要删除的元素个数比之前少,则更新答案 break;} else { // 否则进行标记该元素出现过 book2[a[q]] = 1;}if (book1[a[q]] && p >= book1[a[q]]) { // 如果右半部分的最左端的元素与一开始左半部分要保留的数字重复,//则模拟左半部分元素删除操作,同时判断是否要更新答案和更新左半部分要保留的数字下标 if (ans > q - p) ans = q - p;p = book1[a[q]] - 1;}q--;} printf("%d\n", ans);return 0;
}

我就贴暴力的代码了

#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N = 2010;int n;
int a[N];map<int, int> ma;int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}int ans = n - 1;for (int i = 1; i <= n; i++){ma.clear();bool ok = true;for (int j = 1; j < i; j++){ma[a[j]]++;if (ma[a[j]] == 2){ok = false;break;}}if (!ok)continue;int mn = n + 1;for (int j = n; j >= i; j--){ma[a[j]]++;if (ma[a[j]] == 1){mn = j;}elsebreak;}ans = min(ans, mn - i);}cout << ans << endl;return 0;
}

Uniqueness(思维 or 二分 or 暴力)相关推荐

  1. 【洛谷 - U43391】不是0-1背包的暴力AC(思维,二分,可转化为二元组问题,复习暴力dfs总结)

    题干: https://www.luogu.org/problemnew/show/U43391 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包. 小A的背包最多 ...

  2. POJ3277 线段树段更新,点询问+二分离散化+暴力

    题意:       x轴上有一些矩形,问你这些矩形覆盖的面积和是多少. 思路:       首先范围很大,n很小,果断离散化,然后我们就是求出任意区间的最大值作为当前区间的高,最后在算一遍答案就行了, ...

  3. P1852-跳跳棋【思维,差分,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P1852 题目大意 一个数轴上有333个跳棋,你每次可以将一个跳棋跳到另一个跳棋对称的位置,但是不能一次跨过两个棋子 ...

  4. 【Codeforces - 127D】Password(思维,二分+字符串Hash)

    题干: Asterix, Obelix and their temporary buddies Suffix and Prefix has finally found the Harmony temp ...

  5. BZOJ1863 [ZJOI2006]trouble 皇帝的烦恼 [思维题,二分答案,动态规划]

    皇 帝 的 烦 恼 皇帝的烦恼 皇帝的烦恼 题目描述见链接 . 正 解 部 分 \color{red}{正解部分} 正解部分 当是一条链时, 答案显然为 max ⁡ ( A [ i − 1 ] + A ...

  6. 2020ICPC上海 D Walker(思维、二分、三分)

    链接 题目描述 As a world-famous traveler, Prof. Pang's research interest is to travel as many places as po ...

  7. 【ZOJ - 4029】Now Loading!!!(整除分块,思维,二分,前缀和)

    题干: 其中 zi 是第i次询问后的z. 解题报告: 因为有取log运算,所以分母的取值肯定不会超过30种,所以分每一个分母的时候,用前缀和优化一个和,最后求乘积就行了.(其实不需要快速幂,用快速幂也 ...

  8. 【CodeForces - 589F】Gourmet and Banquet (贪心,思维,二分)

    题干: A gourmet came into the banquet hall, where the cooks suggested n dishes for guests. The gourmet ...

  9. G. Count the Trains(思维set + 二分)

    Codeforces Round #797 (Div. 3) Problem 铁轨上有 n 节车厢,每节车厢在各自的引擎驱动下可以达到一个最高速度,记录在一个序列 { a i } \{a_i\} {a ...

最新文章

  1. Android之EditText的各种使用
  2. Tensorflow【实战Google深度学习框架】—TensorBoard
  3. php和python哪个好-PHP和Python语言选择哪个好
  4. Php基础正则表达式篇
  5. QTP自动化测试视频系列
  6. eclipse修改项目访问前缀
  7. FreeBSD与Linux的比较
  8. PDF转WORD并翻译外文文献,工具转化
  9. 微信-支付宝---人脸识别认证
  10. 网络编程 :System.Net概述(1)
  11. 指数历史估值源码分享,寻找最佳底部机会!
  12. 计算机cpu风扇不转怎么办,电脑cpu风扇不转是怎么回事
  13. 计算机科学数学背景,Emory的Mathematics and Computer Science「埃默里大学数学与计算机科学系」...
  14. 微信公众号菜单模板设置
  15. 描述汇集天地之灵气的上道下器
  16. 単語境界/非単語境界(¥b, ¥B)
  17. 【SCOI 2005】 骑士精神
  18. 新概念英语(1-55)The Sawyer family
  19. 仿京东商城左侧商品分类导航-JS网页特效
  20. 《南瓜书》PumpkinBook

热门文章

  1. Java 调用构造器一定产生新对象吗
  2. 通过编程模拟一个简单的饮料自动贩卖机_你喝过自动贩卖的现榨橙汁吗?
  3. 高中学历能找到程序员的工作吗?
  4. PMP项目管理项目进度管理
  5. 深度学习中的深度信念神经网络
  6. 32、树莓派的简单测试串口通信和超声波模块测距
  7. 如何制作Win7 usb启动盘
  8. Android Studio 自带的 jre 和甲骨文(Oracle)的 JDK
  9. 大连装备制造职业技术学院计算机,大连装备制造职业技术学院
  10. 服务器运维相关知识,服务器维护的基础知识(上)