문제
https://www.acmicpc.net/problem/2457
걸린 시간
01 : 02 : 17
풀이
C++
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0)
#define all(c) c.begin(), c.end()
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int date2day(int month, int day){
int d = day;
for(int m = 1; m <= month-1; m++){
if(m == 2) d += 28;
else if(m == 4 || m == 6 || m == 9 || m == 11) d += 30;
else d += 31;
}
return d;
}
int main(){
fastio;
vector<int> day(date2day(12, 31)+1, 0);
for(int d = date2day(3, 1); d <= date2day(11, 30); d++) day[d] = 1;
int n;
cin >> n;
vector<pair<int, int>> f;
int sm, sd, em, ed;
for(int i = 0; i < n; i++){
cin >> sm >> sd >> em >> ed;
f.push_back({date2day(sm, sd), date2day(em, ed)-1});
}
int ans = 0;
for(int d = 1; d < day.size(); d++){
if(day[d]){
int m = 0;
int c = -1;
for(int i = 0; i < f.size(); i++){
int s = f[i].first;
int e = f[i].second;
if(s <= d && d <= e){
if(m <= e-d){
c = i;
m = e-d;
}
}
}
if(c == -1){
cout << 0 << "\n";
return 0;
}
d = f[c].second;
ans++;
}
}
cout << ans << "\n";
return 0;
}
구현 태그도 달아줘야 할 것 같은 느낌의 그리디 문제였다. 꽃이 피어있어야 하는 3월 1일 부터 11월 30일 까지 매일, 심을 수 있는 꽃을 확인한 후 없으면 0을 출력 후 종료, 있으면 꽃이 지는 날짜에서 현재 날짜를 뺀 값이 제일 큰 꽃을 선택하면 된다. 이미 지나간 꽃의 수명은 정답에 영향을 주지 않으므로 남은 수명이 긴 꽃을 고르는 것이 항상 최적해이다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 1914번 하노이 탑 (0) | 2021.05.15 |
---|---|
Baekjoon 1052번 물병 (0) | 2021.05.15 |
Baekjoon 1629번 곱셈 (0) | 2021.04.25 |
Baekjoon 19948번 음유시인 영재 (0) | 2021.04.18 |
Baekjoon 1744번 수 묶기 (0) | 2021.04.18 |
댓글