codeforces. 756 B. 여행 카드 선택한 여러 바이너리 전송 민주당 +

주제 링크 : HTTPS : //codeforces.com/problemset/problem/756/B의
효과에 따라 :

다음과 같은 방식으로 요금 구조. 티켓은 세 가지 유형으로 구분된다 :
20 루블을 지출 편도 항공권,
90 분 티켓은 50 루블을 요구
티켓 하나 일 (1,440분)는 120 루블을합니다.

시간 t에서 X 분 활성화 티켓 t에서 t + X-1 (포함)의 범위 내에서의 여행을 위해 이용 될 수 있음을 유의해야한다. 모든 여행은 단지 분이 소요된다고 가정.

승객의 선택을 단순화하기 위해, 시스템이 자동으로 최적의 티켓을 선택합니다. 각 여행의 시작 후, 시스템은 모든 이전 및 현재 여행 일정을 분석하고,이 여행은 최소 비용으로 티켓 세트를 선택합니다. 총 금액은 이전에 B로 충전하면서 첫 여행에 이르기까지하는 것은하는 모든 현재 여행 티켓을 최소 비용으로 가정합니다. B의 합 -이 시스템은 다음 승객에게 부과.

당신은 주어진 여행 승객은 승객에게 부과 각 게시물 뇌졸중의 총 비용을 계산하는 프로그램을 작성해야합니다.
그림 삽입 설명 여기

아이디어 : 때마다 당신에게 세 가지 선택. 그런 다음 선택에 따라 최적의 전송 (반)을 찾아

#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