城市交通

题目大意:

编号为1~n的n个城市,每个城市有两个权值Ai和Bi。
对于两个城市i和j,i可到j当且仅当j>i,而费用为(j-i)*Ai+Bj。
求从城市1到城市n的最小费用。n=100000

思路:

dp方程显而易见f[i]:=min(f[j]+(j-i)*ai+bj),因为n=100000直接做是不可以的,那么现在就要用斜率优化优化,把式子化简。
f[j]+j*a[i]+b[j]+i*a[i]因为全和i有关的不会随着j变化变化,然后全部和j有关的可以看成一个整体。所以又可以化成g[j]+j*a[i],这样就是斜率的经典式子了,设一个j>j’当什么时候j’比j优。得出他的斜率。最后维护一个上升的斜率,最后就可以o(logn)出结果了

程序:

 const
        maxn=100000;
var
        a,b,f,s:array [1..maxn] of int64;
        i,j,n,m,x,p:longint;
function hjy(x,y:longint):int64;
begin
        exit(f[x]+a[x]*(y-x));
end;
begin
        readln(n);
        for i:=1 to n do
         read(a[i]);
        for i:=1 to n do
         read(b[i]);
        p:=1;
        for i:=2 to n-1 do
        begin
          if (s[i]>0) and (a[s[i]]<a[p]) then
            if hjy(p,i)>=hjy(s[i],i) then p:=s[i] else
            begin
              x:=(hjy(s[i],i)-hjy(p,i)) div (a[p]-a[s[i]])+i+1;
              if (x<=n) and ((s[x]=0) or (a[s[i]]<a[s[x]])) then s[x]:=s[i];
            end;
            if a[i]<a[p] then
            begin
              f[i]:=hjy(p,i)+b[i];
              x:=b[i] div (a[p]-a[i])+i+1;
              if (x<=n) and ((s[x]=0) or (a[i]<a[s[x]])) then s[x]:=i;
            end;
        end;
        if (s[n]>0) and (a[s[n]]<a[p]) and (hjy(p,n)>hjy(s[n],n)) then p:=s[n];
        writeln(hjy(p,n)+b[n]);
end.
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq872425710/article/details/76940302
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭