BOJ 28777 Фотографии на память
sorohue가 PS하는 블로그
BOJ 28777 Фотографии на память
문제 링크입니다.
문제 요약
$N$개의 정수를 최소 개수의 그룹으로 분할해야 합니다. 그룹을 짓는 방법은 다음의 3가지입니다.
- 1개의 정수
- 차가 20 이하인 두 정수
- 각각의 차가 10 이하인 세 정수
풀이
정수를 크기 순으로 정렬하고 나면 간단한 DP로 문제를 해결할 수 있습니다.
구현 시, 인덱스의 시작 번호를 0이나 1 같은 수로 잡으면 첫 정수를 포함하는 그룹을 지을 때 예외 처리가 귀찮습니다. 인덱스를 3 이상에서 시작해버리고 (딱 계산해서 맞추기 귀찮다면 통 크게 10 정도로 잡아버려도 괜찮아요), 그 앞으로는 그룹 개수를 0으로 맞춰 주면 예외 처리를 피할 수 있습니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
using pii = pair<int, int>;
int a[1010], d[1010];
int main(){
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int n; cin >> n; for(int i = 4; i <= n+3; i++) cin >> a[i];
sort(a+4, a+n+4);
for(int i = 4; i <= n+3; i++){
d[i] = d[i-1]+1;
if(a[i]-a[i-1] <= 20) d[i] = min(d[i], d[i-2]+1);
if(a[i]-a[i-2] <= 10) d[i] = min(d[i], d[i-3]+1);
}
cout << d[n+3];
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.