【UOJ244】【UER #7】短路

贪心算法题解
本文介绍了一种利用贪心算法解决特定问题的方法。通过枚举最深层次并确定关键层为最小值时采取决策,实现从左上角到右下角的路径选择。文章详细解释了算法的具体步骤,并提供了一个C++代码示例。

题解:

感觉贪心水平有所提高。。

首先比较显然的事情是我们可以枚举最深进行到哪一层

我们会发现,当且仅当该层是最小值才会使用决策,

并且是从该层的左上,走到右下

另外中间步骤就是(好难描述啊)一个单调下降序列,每个会走最多的向右走的步数,然后中间的点只走一次  (这句话应该正常人是无法理解的)

但是处理起来还是比较简单的,我们考虑从上一层到这一层实际上就是有一个多往右走一格,所以维护前缀最小值

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IL inline
#define rint register ll
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
const ll N=2e5;
const ll INF=1e18;
ll a[N],n,f[N],ans=INF;
int main()
{
  freopen("1.in","r",stdin);
  freopen("1.out","w",stdout);
  ios::sync_with_stdio(false);
  cin>>n;
  rep(i,1,n+1) cin>>a[i];
  ll mina=INF;
  dep(i,n+1,1)
  {
    if (i==n+1) f[i]=a[i];
    else f[i]=f[i+1]+a[i]+mina;
    if (mina>=a[i])
    {
      ans=min(ans,f[i]*2+(4*i-5)*a[i]);
      mina=a[i];
    }
  }
  cout<<ans<<endl;
  return 0;
}

 

转载于:https://www.cnblogs.com/yinwuxiao/p/9410815.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值