モノトーンのビーコンの送信キューの最適化DP--

炎の転送

ビーコンは、一般道路や有利な場所に建てられた重要な軍事防衛施設です。

軍は、昼間の煙を発生すると、火は軍事夜に合格しました。

n個のビーコンタワーを有する2つの都市間において、各ビーコン信号は、価格を持っています。

情報の正確な伝達を行うために、それは、少なくともM個の連続したビーコンの信号を送信しなければなりません。

今入力N、M及び各ビーコンのコストは、多くの二つの都市の最小値との間の伝達情報に必要な総コストの正確なコストを計算します。

入力フォーマット
最初の二行のは、整数N、M、タイトルは、特定の意味を説明するための参照です。

n個の第2行は、各ビーコンアイのコストの整数を表します。

出力フォーマットは、
最小のコストを表す整数のみを出力します。

データ範囲
1 n , m 2 × 1 0 5 1≤n、m≤2×10 ^ 5
0 a i 1000 0≤a_i≤1000
入力サンプル:
。5. 3
。1 5 6 2 2
出力サンプル:
4

ソリューション:

私たちは、この質問のタイトルは、最も値問題のスライド範囲を知ることです読み取ることができます。私たちは、i番目のi番目のビーコンコストの前に選択されていて、選択されていないため、[i]はそのFを前提としています。そう明らかに状態遷移式f [I] = F [HOLキュー] + W [i]とを。我々単調キューのメンテナンスが最小であるためです。私たちが向かうように、チームは最小限でなければなりません。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int a[N],q[N],f[N];
int main()
{
    int n,m; cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    int hh=0,tt=0;
    for(int i=1;i<=n;i++){
        if(hh<=tt&&q[hh]<i-m) hh++;
        f[i]=f[q[hh]]+a[i];
        while(hh<=tt&&f[q[tt]]>=f[i]) tt--;
        q[++tt]=i;
    }
    int ans=0x3f3f3f3f;
    for(int i=n-m+1;i<=n;i++) ans=min(ans,f[i]);
    cout<<ans<<endl;
}

公開された92元の記事 ウォンの賞賛6 ビュー1131

おすすめ

転載: blog.csdn.net/weixin_42979819/article/details/104015664