본문 바로가기

Algorithm/BAEKJOON

[BOJ] 1263번 시간 관리 (C++)

728x90
반응형

https://www.acmicpc.net/problem/1263

 

1263번: 시간 관리

진영이는 캠프 조교를 온 후 효율적으로 시간 관리를 해야 한다는 것을 깨달았다. 진영이는 하루에 해야 할 일이 총 N개가 있고 이 일들을 편하게 1번부터 N번까지 차례대로 번호를 붙였다. 진영

www.acmicpc.net

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool compare(pair<int, int>& a, pair<int, int>& b) {
	return a.second > b.second;
}

int main() {
	int n, t, s, tmp = 0, left = 0;
	cin >> n;

	vector<pair<int, int>> v(n);
	for (int i = 0; i < n; i++) {
		cin >> t >> s;
		v.push_back({ t, s });
	}

	sort(v.begin(), v.end(), compare);

	for (int i = 0; i < n; i++) {
		if (i != 0) {
			if (v[i].second >= tmp) left += v[i].second - tmp;
			else if (tmp - v[i].second >= left) left = 0;
			else if (tmp - v[i].second < left) left -= tmp - v[i].second;
		}
		tmp = v[i].second - v[i].first;
	}

	if (left > 0) tmp -= left; 

	if (tmp < 0) cout << -1 << endl;
	else cout << tmp << endl;

	return 0;
}

 

 

끝내야할 시간(t)와 걸리는 시간(s)를 입력받아 벡터에 넣는다. 끝내야할 시간이 늦은 일이 먼저 오도록 정렬한다.

 

맨 처음 끝내야할 시간이 가장 늦은 일에서  t - s는 시작하는 시간(tmp)이다. 

 

그 다음 1) 일을 끝내야할 시간이 이전 일을 시작하는 시간(tmp)보다 늦다면

현재 일을 끝내야할 시간 - 이전 일을 시작하는 시간

은 겹치기 때문에 left에 저장해둔다.

 

2) 일을 끝내야할 시간이 이전 일을 시작하는 시간(tmp)보다 빠르다면

시간이 남은 것이므로 left에 저장해둔 일을 할 수 있다.

- 남은 시간이 left보다 많거나 같다면 left를 모두 해서 0이 되고

- left보다 적다면 left에서 남은 시간을 뺀다.

 

마지막에 left가 남았다면 tmp에서 left를 빼준다. tmp는 일을 최대한 늦게 시작하는 시간이 된다.

tmp가 0보다 작다면 0시부터 시작하여도 일을 끝마칠 수 없는 것이므로 -1을 출력하고

그렇지 않으면 tmp를 출력한다.

728x90
반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[BOJ] 1931번 회의실 배정 (C++)  (0) 2022.02.11
[BOJ] 6068번 시간 관리하기 (C++)  (0) 2022.02.11
[BOJ] 14490번 백대열 (C++)  (0) 2022.02.06
[BOJ] 1302번 베스트셀러 (C++)  (0) 2022.02.06
[BOJ] 7656번 만능 오라클 (C++)  (0) 2022.02.05