• 蓝桥杯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判断区间是否相交,但是时间复杂度好像有点问题,应该不是很对。

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

    注意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. }

  • 相关阅读:
    DML(插入 更新 删除),附代码理解
    UG\NX二次开发 在资源栏(左侧面板)中添加按钮
    kubenetes-pod高可用
    Layui之新增修改功能
    SQL 优化经历:从 30248秒到 0.001秒的经历
    DAB-DETR
    ViewModel的共享(上)
    C2基础设施威胁情报对抗策略
    23种设计模式-抽象工厂模式介绍加实战代码
    Spire.Cloud 私有化部署教程(三) - Windows 系统
  • 原文地址:https://blog.csdn.net/m0_73673533/article/details/137784833