codeforces。756 B.トラベルカードの選択した複数のバイナリ転送のDP +

トピックリンクします。https://codeforces.com/problemset/problem/756/Bの
効果の対象に:

次のように運賃構造。チケットは3種類に分けられます。
20ルーブルを過ごすために片道切符、
90分のチケットは、50ルーブルを必要と
チケット1日(1440分)、それは120ルーブルをとります。

時刻t X分起動チケットはTからT + X -1(両端を含む)の範囲内の旅行のために使用されてもよいことに留意されたいです。すべての旅行は唯一分かかりと仮定。

乗客の選択を簡単にするために、システムが自動的に最高のチケットを選択します。各旅行開始後、システムはすべて前回と今回の旅程を分析し、これらの旅行は、最小のコストでのチケットのセットを選択します。合計金額が以前Bに投入しながら、すべての現在の往復チケット最低の総コストを想定して最初の旅行に至るまで。その後、乗客への充電システム - Bの合計。

あなたは、与えられた旅行の乗客は、乗客に充電後の各ストロークの総コストを計算するためのプログラムを書く必要があります。
ここに画像を挿入説明

アイデア:あなたの3つの選択肢たびに。そして、選択に基づいて、最適な転送(半分)を見つけます

#include <bits/stdc++.h>
#define LL long long
using namespace std;
 
int n, a[100010], f[100010];
int main()
{
    scanf("%d", &n);
    for(int i=1; i<=n; i++){
        scanf("%d", &a[i]);
    }
    for(int i=1; i<=n; i++){
        f[i]=f[i-1]+20;
        int p=(lower_bound(a+1, a+n+1, a[i]-89)-a-1);
        f[i]=min(f[i], f[p]+50);
        p=(lower_bound(a+1, a+n+1, a[i]-1439)-a-1);
        f[i]=min(f[i], f[p]+120);
        printf("%d\n", f[i]-f[i-1]);
    }
 
    return 0;
}
公開された374元の記事 ウォン称賛22 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq_21433411/article/details/103216010