The 2023 Guangdong Provincial Collegiate Programming Contest

I. Path Planning

嗯,怎么说呢,一般二维图,数据不是很大的比如n*m*log级别允许的,如果一眼不是bfs,可以考虑结合一下二分

本题可知,只能向下或者向右,那么我们就像如果答案为x,那么一定会有一条0到x-1的路存在,

我们再想一条路肯定是先右再下,然后重复进行的,类似于一个楼梯的样子。

二分我们知道了,但是check里面如何判断才能配合二分呢,对于我们check的mid ,我们可以先按行排序再按列排序,然后按这个先行后列的顺序按我们的原图找0~mid-1的数,然后只看列是否满足即可,也就是上一个的列值小于等与目前的列值。

int n, m;
int a[N];
bool check(int mid)
{
    int last = -1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (a[(i - 1) * m + j] <= mid - 1)
            {
                if (j < last)
                    return false;
                last = j;
            }
        }
    }
    return 1;
}
void solve()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> a[(i - 1) * m + j];
        }
    }
    int l = 0, r = n * m;
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid))
            l = mid;
        else
            r = mid - 1;
    }
    cout << r << endl;
}

B. Base Station Construction

题意:就是跟你一堆区间,每个区间里面必选选一个点,问最小花费。

我们考虑从dp下手,定义f[i] 为代表前 i 个位置且第 i 个位置必选选的最小花费,

定义完成以后我们考虑如何转移,显然我们要选的哪个点 J 要满足 在 \left [ j+1,i-1\right ] 之间不包含完整的一个区间不然就漏掉了,转移方程那就是 f[i]=minf[j]+a[i]. 我们知道了 j 的区间范围但是不能 n方的去转移,我们考虑用单调对列来维护 一下 f[j] ,那么问题就解决了,最后我们在n+1位置建一个单点区间,以便于我们不用循环最后一个区间来找最小值了。

struct node
{
    int l, r;
    bool operator<(const node &w) const
    {
        if (r != w.r)
            return r < w.r;
        return l < w.l;
    }
} p[N];
int a[N], b[N], que[N];
void solve()
{
    int n, m;
    cin >> n;
    vector<int> f(n + 10); // f[i]表示前i个位置且第i个位置必选的最小花费

    for (int i = 1; i <= n; i++)
        cin >> a[i];

    a[++n] = 0;
    cin >> m;
    for (int i = 1; i <= m; i++)
    {
        int l, r;
        cin >> l >> r;
        p[i] = {l, r};
    }
    sort(p + 1, p + 1 + m);
    priority_queue<PII> q;
    for (int i = 1, j = 0, k = 0; i <= n; i++)
    {
        while (j <= m && p[j].r < i)
            q.push({p[j].l, p[j].r}), j++;
        if (q.size() && q.top().xx > k)
            k = q.top().xx;
        b[i] = k;
    }
    int hh = 0, tt = 0; // 一开始里面有个0,相当于第一个限制区间,前面没有限制区间,也就是可以选单点,提前push一个0

    for (int i = 1; i <= n; i++)
    {
        int k = b[i];
        while (hh <= tt && que[hh] < k)
            hh++;
        f[i] = f[que[hh]] + a[i];
        cout << f[i] << endl;
        while (hh <= tt && f[que[tt]] >= f[i])
            tt--;
        que[++tt] = i;
    }
    cout << f[n] << endl;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AIGC(Artificial Intelligence Generated Content,人工智能生成内容)的重要性体现在以下几个方面: 内容创作效率提升: AIGC能够快速生成大量高质量的内容,包括文本、图像、音频、视频等,极大地提高了创作效率。这不仅降低了人力成本,也使得内容更新和迭代的速度加快,满足了信息爆炸时代人们对新鲜内容的高需求。 个性化和定制化服务: AIGC可以根据用户的需求和偏好自动生成个性化的内容。这种能力在教育、娱乐、营销等领域具有巨大价值,能够提供高度定制化的用户体验,增强用户黏性和满意度。 创新与发现新应用: AIGC技术的不断发展和普及促进了新的应用场景和商业模式的诞生。通过降低开发门槛,更多的开发者和企业能够探索和实验AIGC的应用,有可能催生出全新的现象级应用和服务。 商业效益增长: AIGC在数字商业化领域具有显著优势。它能够赋能营销策略,提高广告和推广的精准度和效果,从而带动企业收入的增长。同时,通过自动化的内容生成,企业可以节省资源并专注于核心业务的创新和发展。 知识传播与教育: AIGC能够生成教育材料、教程和知识摘要,帮助人们更高效地获取和学习新知识。在教育领域,AIGC可以个性化定制学习路径和内容,适应不同学生的学习速度和方式。 行业效率优化: 在保险、出版、法律等行业,AIGC可以自动处理大量的文档、报告和合同,提高工作效率,减少人为错误,并提供数据分析和决策支持。 学术研究与伦理考量: AIGC在学术研究中的应用需要遵循特定的使用边界和准则,以防止学术不端行为。明确的指南有助于确保研究成果的真实性和可信度,同时推动AI技术在科研领域的健康发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值