zoukankan      html  css  js  c++  java
  • 烽火传递

    Description

    烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息;夜晚燃烧干柴,以火光传递军情,在某两座城市之间有 n 个烽火台,每个烽火台发出信号都有一定代价。为了使情报准确地传递,在连续 m 个烽火台中至少要有一个发出信号。请计算总共最少花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确传递。

    Input

    第一行:两个整数 N,M。其中N表示烽火台的个数, M 表示在连续 m 个烽火台中至少要有一个发出信号。接下来 N 行,每行一个数 Wi,表示第i个烽火台发出信号所需代价。

    Output

    一行,表示答案。

    Sample Input

    5 3
    1
    2
    5
    6
    2

    Sample Output

    4

    Hint

    对于50%的数据,M≤N≤1,000 。
    对于100%的数据,M≤N≤100,000,Wi≤100。

    .
    .
    .
    .
    .
    .
    分析
    动态转移方程:
    f[i]=min(f[j])(i-m<j<i) +a[i]

    寻找最小值可用单调队列优化,f[i-1]为要插入的数据

    .
    .
    .
    .
    .
    程序:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    
    int n,m,a[100001],f[100001],q[200001];
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=n;i++)
    		scanf("%d",&a[i]);
    	int head=1,tail=1;
    	for (int i=1;i<=n;i++)
    	{
    		while (head<=tail&&f[q[tail]]>=f[i-1]) tail--;
    		tail++;
    		q[tail]=i-1;
    		while (head<=tail&&(i-1)-q[head]+1>m) head++;
    		f[i]=f[q[head]]+a[i];
    	}
    	int ans=2147483647;
    	for (int i=n-m+1;i<=n;i++)
    		ans=min(ans,f[i]);
    	printf("%d",ans);
    	return 0;
    }
    
  • 相关阅读:
    使用PHP类库PHPqrCode生成二维码
    ABAP报表中建立过滤器,并相互切换
    MM定价计算方案确定详细图解
    MIGO 屏幕增强
    SE14 激活表时提示进程正在运行
    供应商寄售
    屏蔽VA01的TA類型的銷售部門和銷售組
    屏蔽標準TCODE上的一些字段的顯示、隱藏或者強制輸入(轉)
    采购订单流程
    SAP 中如何修改透明表数据
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/10292787.html
Copyright © 2011-2022 走看看