※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 27112번 문제인 시간 외 근무 멈춰!이다.
문제는 아래 링크를 확인하자.

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

 

27112번: 시간 외 근무 멈춰!

오늘도 여러 체계의 개발 임무를 열심히 수행 중인 준민이에게 갑자기 새로운 개발 프로젝트가 들어왔다. 해당 개발 프로젝트는 총 $N$개의 작업으로 이루어져 있으며, 각 작업은 $t_i$의 근무일

www.acmicpc.net

주어지는 N개의 작업을 마감기한이 다가오는 순서, 즉 d값이 오름차순인 순서대로 작업하는 것으로 항상 최적해를 구할 수 있음은 쉽게 관찰할 수 있다. 평시 근무가 가능한 잔여 날의 수와 시간 외 근무가 가능한 잔여 날의 수를 관리 및 유지해 문제를 해결해보자.

 

글쓴이는 d의 값이 10만 이하이므로, 하루하루가 지나는 것을 직접 시뮬레이션하며 월~금요일일 경우 평시 근무 가능 시간 1과 시간 외 근무 가능 시간 1을, 토~일요일일 경우 시간 외 근무 가능 시간 1만을 늘려나가는 식으로 근무 시간을 관리해 문제를 해결하였다. 이는 아래 코드와 같이 근무 일수를 7로 나눈 나머지를 이용해 깔끔하게 구현할 수 있다.

 

아래는 제출한 소스코드이다.

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

int N;
pair<int, int> work[100000];
int daycnt, x, y;
int ans;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int n = 0; n < N; n++) {
		cin >> work[n].first >> work[n].second;
	}
	sort(work, work + N);

	for (int n = 0; n < N; n++) {
		while (daycnt < work[n].first) {
			if (daycnt % 7 < 5) x++;
			y++, daycnt++;
		}
		if (x >= work[n].second) x -= work[n].second;
		else if (x + y >= work[n].second) {
			int tmp = work[n].second - x;
			x = 0, y -= tmp, ans += tmp;
		}
		else {
			cout << -1;
			return 0;
		}
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 27114 // C++] 조교의 맹연습  (0) 2023.01.26
[BOJ 25375 // C++] 아주 간단한 문제  (0) 2023.01.26
[BOJ 27111 // C++] 출입 기록  (0) 2023.01.25
[BOJ 25373 // C++] 벼락치기  (0) 2023.01.25
[BOJ 10855 // C++] Extreme Sort  (0) 2023.01.25

+ Recent posts