当前位置:   article > 正文

蓝桥杯2024年第十五届省赛_蓝桥杯2024年第十五届省赛真题-宝石组合

蓝桥杯2024年第十五届省赛真题-宝石组合

E:宝石组合

根据给的公式化简后变为gcd(a,b,c)根据算数基本定理,推一下就可以了

然后我们对1到mx的树求约数,并记录约数的次数,我们选择一个最大的且次数大于等3的就是gcd

  1. int mx;
  2. vector<int> g[N];
  3. vector<int> cnt[N];
  4. int n;
  5. int a[N];
  6. void solve()
  7. {
  8. cin >> n;
  9. for (int i = 1; i <= n; i++)
  10. {
  11. cin >> a[i];
  12. mx = max(mx, a[i]);
  13. }
  14. for (int i = 1; i <= mx; i++)
  15. {
  16. for (int j = 1; j * i <= mx; j++)
  17. {
  18. g[i * j].pb(i);
  19. }
  20. }
  21. vector<int> ans;
  22. sort(a + 1, a + 1 + n);
  23. for (int i = 1; i <= n; i++)
  24. {
  25. int t = a[i];
  26. for (auto ed : g[t])
  27. {
  28. cnt[ed].pb(t);
  29. }
  30. }
  31. int res = 0;
  32. for (int i = 1; i <= mx; i++)
  33. if (cnt[i].size() >= 3)
  34. res = i;
  35. for (int i = 0; i < 3; i++)
  36. cout << cnt[res][i] << " ";
  37. }

H:拔河

赛时写的记录全部区间和,然后sort判断区间是否相交,但是时间复杂度好像有点问题,应该不是很对。

这里看了别人写的n2logn复杂度的做法,具体说就是,我们首先枚举右端点再左端点,然后对于枚举的每一段区间我们只看右边即可了,因为左边的合理的方案在左边已经枚举过了,然后二分找大于等于当前的,这里我们也只需看右边就行,不需要在减一了原理和上面相同,然后我们枚举玩一个右端点后,把以下一个右段点为起点的区间全部删去,这样满足了下一个循环

注意1需要特殊处理一下,一开始就不存进set里面

  1. const int N = 1003;
  2. int a[N];
  3. int n;
  4. int s[N];
  5. signed main()
  6. {
  7. scanf("%d", &n);
  8. for (int i = 1; i <= n; i++)
  9. scanf("%d", &a[i]), s[i] = s[i - 1] + a[i];
  10. multiset<int> S;
  11. for (int l = 1; l <= n; l++) // 提前把1全删去了
  12. {
  13. for (int r = l + 1; r <= n; r++)
  14. {
  15. S.insert(s[r] - s[l]);
  16. }
  17. }
  18. int res = 1e18;
  19. for (int r = 1; r < n; r++) // 但是l==1的时候并没有,所以一开始就调过1
  20. {
  21. for (int l = 1; l <= r; l++) // 本身也被r==l的时候删去了
  22. {
  23. int val = s[r] - s[l - 1];
  24. auto it = S.lower_bound(val);
  25. if (it != S.end())
  26. {
  27. int ans = abs(*it - val);
  28. res = min(res, ans);
  29. }
  30. if (it != S.begin())
  31. {
  32. it--;
  33. int ans = abs(*it - val);
  34. res = min(res, ans);
  35. }
  36. }
  37. for (int r2 = r + 1; r2 <= n; r2++) // 提前把下一个断点删去
  38. {
  39. S.erase(S.find(s[r2] - s[r]));
  40. }
  41. }
  42. printf("%lld\n", res);
  43. return 0;
  44. }

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

闽ICP备14008679号