250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준#boj#12755
- 백준#boj#16932#모양만들기
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#2615#오목
- 백준#BOJ#12865#평범한배낭
- 백준#BOJ#1939#중량제한
- 백준#BOJ#14501#퇴사#브루트포스
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[boj : 2651]자동차경주대회 본문
문제 : 도착지점까지 정비소에 들려 최소의 시간으로 도착할 수 있는 케이스를 구해라
풀이 : LIS의 응용버전
1)각 정비소간 거리를 prefix 로 담아준다.
2)O(n^2)의 시간복잡도를 활용하여 정비소간 차이가 D(정비소에 들렸을때 최대로 갈 수 있는 거리) 이하이고 시간이 더 적게 걸릴때 업데이트, 또한 지금까지 거쳐온 정비소의 번호를 기록해 둔다.
3)지나온 자취를 역추적
+
데이터 추가로 코드 수정(int->long long)으로 경계값 입력시 다른 답을 도출했기 때문
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
ll arr[110], Time[110], prefix[110];
ll A[110], B[110];
vector<ll> v;
ll solve(ll x);
int main()
{
ll d, n;
cin >> d >> n;
for (ll i = 1; i <= n + 1; i++) {
cin >> arr[i];
prefix[i] = prefix[i - 1] + arr[i];
A[i] = (ll)10e9;
}
for (ll i = 1; i <= n; i++) {
cin >> Time[i];
}
for (ll i = 1; i <= n + 1; i++)
if (prefix[i] <= d)
A[i] = Time[i];
for (ll i = 1; i <= n + 1; i++) {
for (ll j = 1; j < i; j++)
{
if (prefix[i] - prefix[j] <= d && A[i] > A[j] + Time[i]) {
B[i] = j;
A[i] = A[j] + Time[i];
}
}
}
ll r = solve(n + 1);
cout << A[n + 1] << "\n" << v.size() << "\n";
for (ll u : v)
cout << u << " ";
return 0;
}
ll solve(ll x)
{
if (B[x] == 0)return x;
ll ret = solve(B[x]);
v.push_back(ret);
return x;
}
'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글
[boj : 20292] 컨설팅 (0) | 2020.12.03 |
---|---|
[boj : 2459] 철사 자르기 (0) | 2020.11.23 |
[boj : 2020] 부분 염기서열 (2) | 2020.11.05 |
[boj : 12755] 수면 장애 (0) | 2020.08.12 |
[boj : 8012]한동이는 영업사원! (0) | 2019.07.20 |