当前位置:   article > 正文

蓝桥杯高频考点真题单——4.修改数组

蓝桥杯高频考点真题单——4.修改数组

修改数组

8.修改数组 - 蓝桥云课 (lanqiao.cn)

本来我的思路很一般,用一个set,记录每一段的最值,然后分情况讨论,如果查询到未记录的,那就直接输出,并记录。如果当前值前面已经有过,那就直接从set中调出首个比他大的值,就是该段最值(下面我称之为大哥)。

错误思路:

  1. for (int i = 0; i < n; i++)
  2. {
  3. cin >> a;
  4. if (book[a] == 0) //如果没有标记过
  5. {
  6. if (book[a - 1] == 0 && book[a + 1] == 0) //单独作为大哥
  7. {
  8. book[a] = 2;
  9. prime.insert(a);
  10. }
  11. else if (book[a - 1] == 2 && book[a + 1] == 0) //在其他大哥之前
  12. {
  13. book[a - 1] = 1;
  14. book[a] = 2;
  15. prime.erase(a - 1);
  16. prime.insert(a);
  17. }
  18. else if(book[a - 1] == 0 && book[a + 1] != 0) //接在屁股后面,不管他
  19. book[a] = 1;
  20. cout << a << " "; //没标记过,说明之前无值,直接输出
  21. }
  22. else //之前标记过
  23. {
  24. int bro = getPrime(a); //找到大哥
  25. book[bro + 1] = 2; //更新大哥
  26. book[bro] = 1;
  27. prime.erase(bro);
  28. prime.insert(bro + 1);
  29. cout << bro + 1 << " "; //输出新大哥
  30. }
  31. }

上面的思路我觉得问题在于情况的讨论,而且大数据下也无法验证其准确性。还是老老实实用并查集吧。

什么时候用并查集?当你需要大哥的时候。思路和上面类似,值得注意的是,因为本题的集合是线段,而不是图,所以join函数根本没用,但是为了让大家对并查集的整体认知,还是写在代码中,可以自行删除。

还有就是需要一定程度上进行优化。

AC:

  1. #include <iostream>
  2. using namespace std;
  3. // 其实在我写第一个set的时候,就已经有种超级熟悉的感觉了,并查集,找大哥
  4. const int N = 1e6 + 3;
  5. int n;
  6. int pre[N];
  7. void init()
  8. {
  9. for (int i = 0; i <= N; i++) pre[i] = i;
  10. }
  11. int find(int a)
  12. {
  13. /* 会超时,这里优化一下find,让她直接指向大哥
  14. while (pre[a] != a)
  15. a = pre[a];
  16. return a;*/
  17. int root = a;
  18. while (pre[root] != root) root = pre[root];
  19. int fa = pre[a];
  20. while (fa != root)
  21. {
  22. pre[a] = root;
  23. a = fa;
  24. fa = pre[a];
  25. }
  26. return root;
  27. }
  28. //join可以删除
  29. void join(int a, int b)
  30. {
  31. int fa = find(a);
  32. int fb = find(b);
  33. if (fa != fb) pre[fa] = fb;
  34. }
  35. int main()
  36. {
  37. init();
  38. cin >> n;
  39. int a;
  40. for (int i = 0; i < n; i++)
  41. {
  42. cin >> a;
  43. a = find(a);
  44. cout << a << " ";
  45. pre[a] = a + 1;
  46. }
  47. return 0;
  48. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/616549
推荐阅读
相关标签
  

闽ICP备14008679号