标签:
烽火传递
【题目描述】
烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情。在某两座城市之间有n个烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确的传递,在m个烽火台中至少要有一个发出信号。现输入n、m和每个烽火台发出的信号的代价,请计算总共最少需要花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确的传递!!!
【输入描述】
第一行有两个数n,m(1<=n,m<=1000000)分别表示n个烽火台,在m个烽火台中至少要有一个发出信号。
第二行为n个数,表示每一个烽火台的代价。
【输出描述】
一个数,即最小代价。
【样例输入】
5 3
1 2 5 6 2
【样例输出】
4
分析:
多增加两个点表示两座城市,将它们看做代价为0的烽火台,然后很容易写出DP式子:
f[i]:=min(f[j])+a[i](i-m<=j<i)
然后用单调队列优化,队列元素保存f数组的值,维护单调递增队列,每次取队头即可。
代码1(DP+单调队列):
program fire; var f,a,b,g:array[0..1000001]of longint; n,i,m,h,t:longint; procedure work(x:longint); begin t:=t+1; b[t]:=f[x]; g[t]:=x; while (b[t]<=b[t-1])and(t>h) do begin t:=t-1; b[t]:=b[t+1]; g[t]:=g[t+1]; end; if x-g[h]=m then h:=h+1; end; begin assign(input,‘fire.in‘); reset(input); assign(output,‘fire.out‘); rewrite(output); readln(n,m); for i:=1 to n do read(a[i]); n:=n+1; f[0]:=0; b[1]:=0;g[1]:=0;h:=1; t:=1; for i:=1 to n do begin f[i]:=b[h]+a[i]; work(i); end; writeln(f[n]); close(input); close(output); end.
也可以用堆来优化,每次取的时候判断根节点是否超出范围,超出则删除,继续判断,直到符合要求。
代码2(DP+堆):
program fire; var f,a,b,g:array[0..2000001]of longint; n,i,m,t:longint; function get(x:longint):longint; var i,s,tmp:longint; begin while (x-g[1]>m)and(t>1) do begin b[1]:=b[t]; g[1]:=g[t];t:=t-1; i:=1; while (i*2<=t)or(i*2+1<=t) do begin if (i*2+1>t)or(b[i*2]<b[i*2+1]) then s:=i*2 else s:=i*2+1; if b[i]>b[s] then begin tmp:=b[i]; b[i]:=b[s]; b[s]:=tmp; tmp:=g[i]; g[i]:=g[s]; g[s]:=tmp; i:=s; end else break; end; end; get:=b[1]; end; procedure put(x:longint); var s,tmp:longint; begin t:=t+1;b[t]:=f[x];g[t]:=x; s:=t; while (s<>1)and(b[s div 2]>b[s]) do begin tmp:=b[s div 2]; b[s div 2]:=b[s]; b[s]:=tmp; tmp:=g[s div 2]; g[s div 2]:=g[s]; g[s]:=tmp; s:=s div 2; end; end; begin assign(input,‘fire.in‘); reset(input); assign(output,‘fire.out‘); rewrite(output); readln(n,m); for i:=1 to n do read(a[i]); n:=n+1; f[0]:=0; b[1]:=0;g[1]:=0; t:=1; for i:=1 to n do begin f[i]:=get(i)+a[i]; put(i); end; writeln(f[n]); close(input); close(output); end.
标签:
原文地址:http://www.cnblogs.com/qtyytq/p/4329634.html