주제 링크 : 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;
}