VIJOS-P1091 环城旅行

本文介绍了一种解决环形赛道加油问题的算法。通过预处理每个站点的油量变化,找到能够确保汽车不透支油量完成全程的起点。算法简单高效,避免了使用复杂的数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://vijos.org/p/1091
题解:
一个环,环上的边为行驶这段路所需的油,每个点权为这个点能够给汽车补充的油的数量。问从哪些点能够顺利的跑完一圈。油正好保证跑完全程。
首先是环的问题,通常解决环的问题都使用空间倍增的方法!即复制一份同样的数组,把两个数组连接起来。
预处理a[i]=j,表示从1号点出发到达i点油箱内透支的油的量(其实就是(-1)*油箱内油的量)。a[n+1]到a[2*n]与前面的值相同。
引入升序单调队列,来维护a数组,假如以k点为结束点(也是起始点)的话那么它前面的n-1个a[ ]中的最小值如果大于等于a[k],说明以k点结束可以跑完全程。
可以理解为初始从k出发的时候我就借了a[k]这么多的油放到了油箱中,在跑的过程中所需透支油的最大值我都能满足,说明我能够跑完全程。在过程中,我慢慢的还啊,还啊,最后还清了,也跑到终点了。

#include<stdio.h>
int n,m;
int add[500002];
int dis[500002];
int a[1000002];
int que[1000002];
int main()
{
    scanf("%d%d",&n,&m);
    int i,j,k;
    int sum=0;
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&dis[i],&add[i]);
        sum+=dis[i];
    }
    dis[1]=m-sum;
    sum=0;
    for(i=2;i<=n;i++)
    {
        sum-=add[i-1]-dis[i];
        a[i]=sum;
    }
    a[n+1]=0;
    for(i=n+2;i<=n*2;i++)
    {
        a[i]=a[i-n];
    }
    int le=1,ri=0;
    sum=0;
    for(i=2;i<=n*2;i++)
    {
        if(le<=ri&&i-que[le]>n) le++;
        if(i>n)
        {
            if(a[i]>=a[que[le]])
            {
                if(sum==0)
                {
                    printf("%d",i-n);
                }
                else
                {
                    printf(" %d",i-n);
                }
                sum++;
            }
        }
        while(le<=ri&&a[i]>a[que[ri]]) ri--;
        que[++ri]=i;
    }
    if(sum==0)
    {
        printf("-1");
    }
    return 0;
}

……………………………………………………………………………………………………………
……………………………………………………………………………………………………………
但是,后来我发现
这 就是 一 水题
不用这么麻烦,根本不用单调队列
直接预处理gas[i]表示从1号点出发到达i点时油箱内油的量(可以为负),
求出最小值,将所有gas[k]==min的k全部输出就可以了

很好理解,若从k点出发,则相当于使 gas[k]=0
也就是让所有gas[j] (1<=j<=n) 都加上 (-1)*gas[k]
因为gas[k]为最小值,所以 gas[i] 加上 (-1)*gas[k]后一定 >=0
也就是 不会透支
这里写图片描述 呵呵

#include<stdio.h>
int n,m;
int add[500002];
int dis[500002];
int a[500002];
int main()
{
    scanf("%d%d",&n,&m);
    int i;
    int sum=0;
    for(i=1;i<=n;i++){scanf("%d%d",&dis[i],&add[i]);sum+=dis[i];}
    dis[1]=m-sum;
    for(i=2;i<=n;i++) a[i]=a[i-1]+add[i-1]-dis[i];
    int num=0,min=0x7f7f7f7f;
    for(i=1;i<=n;i++) if(min>a[i]) min=a[i];
    for(i=1;i<=n;i++)
    {
        if(a[i]==min)
        {
            if(num==0)printf("%d",i);
            else printf(" %d",i);
            num++;
        }
    }
    if(num==0) printf("-1");
    return 0;
}
内容概要:本文档详细介绍了基于弹性架构搜索(Elastic Architecture Search, EAS)结合Transformer编码器进行多变量时间序列预测的项目实例。项目旨在自动化优化多变量时间序列预测模型结构,提升预测精度与鲁棒性,降低计算资源消耗,实现模型轻量化。通过MATLAB实现,项目采用Transformer编码器的多头自注意力机制,结合EAS的弹性权重共享和分阶段搜索策略,解决了高维多变量时间序列的复杂依赖建模、架构搜索计算资源需求高、模型过拟合、多步预测误差积累、数据异构性与缺失值处理、复杂模型训练收敛等挑战。最终,项目构建了一个高度模块化和可扩展的系统设计,适用于智能制造、能源管理、智慧交通等多个工业场景。 适合人群:具备一定编程基础,对时间序列预测、深度学习及MATLAB有一定了解的研发人员和研究人员。 使用场景及目标:①自动化优化多变量时间序列预测模型结构,提升预测精度与鲁棒性;②降低计算资源消耗,实现模型轻量化;③实现高度模块化与可扩展的系统设计,促进人工智能在工业领域的深度应用;④提供科研与教学的典范案例与工具,探索深度学习架构搜索在时序预测的前沿技术;⑤促进多变量时序数据融合与异质信息处理能力,推动MATLAB深度学习工具箱的应用与扩展。 其他说明:项目不仅聚焦于模型性能提升,更注重计算资源节约和应用落地的可行性。借助弹性架构搜索自动化调参,减少人工经验依赖,加快模型迭代速度,降低开发门槛。结合Transformer编码器的表达能力,显著改善多变量时间序列预测中的长期依赖捕捉和异质数据融合问题,为各类时间序列分析任务提供一种全新的解决方案。项目通过详细的代码实现和注释,帮助用户理解Transformer机制与弹性架构搜索如何协同工作,实现多变量时间序列预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值