蓝桥杯2024年第十五届省赛

E:宝石组合

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

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

复制代码
int mx;
vector<int> g[N];
vector<int> cnt[N];
int n;
int a[N];
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        mx = max(mx, a[i]);
    }
    for (int i = 1; i <= mx; i++)
    {
        for (int j = 1; j * i <= mx; j++)
        {
            g[i * j].pb(i);
        }
    }
    vector<int> ans;
    sort(a + 1, a + 1 + n);
    for (int i = 1; i <= n; i++)
    {
        int t = a[i];
        for (auto ed : g[t])
        {
            cnt[ed].pb(t);
        }
    }
    int res = 0;
    for (int i = 1; i <= mx; i++)
        if (cnt[i].size() >= 3)
            res = i;
    for (int i = 0; i < 3; i++)
        cout << cnt[res][i] << " ";
}

H:拔河

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

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

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

复制代码
const int N = 1003;
int a[N];
int n;
int s[N];
signed main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]), s[i] = s[i - 1] + a[i];

    multiset<int> S;
    for (int l = 1; l <= n; l++) // 提前把1全删去了
    {
        for (int r = l + 1; r <= n; r++)
        {
            S.insert(s[r] - s[l]);
        }
    }
    int res = 1e18;
    for (int r = 1; r < n; r++) // 但是l==1的时候并没有,所以一开始就调过1
    {
        for (int l = 1; l <= r; l++) // 本身也被r==l的时候删去了
        {
            int val = s[r] - s[l - 1];

            auto it = S.lower_bound(val);
            if (it != S.end())
            {
                int ans = abs(*it - val);
                res = min(res, ans);
            }
            if (it != S.begin())
            {
                it--;
                int ans = abs(*it - val);
                res = min(res, ans);
            }
        }
        for (int r2 = r + 1; r2 <= n; r2++) // 提前把下一个断点删去
        {
            S.erase(S.find(s[r2] - s[r]));
        }
    }
    printf("%lld\n", res);
    return 0;
}
相关推荐
AGI前沿10 分钟前
AdamW的继任者?AdamHD让LLM训练提速15%,性能提升4.7%,显存再省30%
人工智能·算法·语言模型·aigc
Tan_Ying_Y12 分钟前
什么是垃圾回收算法 他的底层原理是什么?
算法
Xの哲學25 分钟前
Linux 分区表深度技术剖析
linux·网络·算法·架构·边缘计算
写写闲篇儿32 分钟前
经典算法题剖析之传递信息(三)
算法
上不如老下不如小34 分钟前
2025年第七届全国高校计算机能力挑战赛初赛 Python组 编程题汇总
开发语言·python·算法
小年糕是糕手1 小时前
【C++】类和对象(二) -- 构造函数、析构函数
java·c语言·开发语言·数据结构·c++·算法·leetcode
kupeThinkPoem1 小时前
跳表有哪些算法?
数据结构·算法
前端小L1 小时前
图论专题(二十一):并查集的“工程应用”——拔线重连,修复「连通网络」
数据结构·算法·深度优先·图论·宽度优先
88号技师2 小时前
2025年9月一区SCI-孤行尺蠖觅食优化算法Solitary Inchworm Foraging-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
前端小L2 小时前
图论专题(二十五):最小生成树(MST)——用最少的钱,连通整个世界「连接所有点的最小费用」
算法·矩阵·深度优先·图论·宽度优先