매우 간단한 greedy와 sort 문제이다.
입력받은 물이 새는 위치를 정렬하고, 정렬된 값을 앞에서부터 테이프를 가장 많이 남기는 방식으로 붙여나가면 된다. 이것의 정당성 증명은 간단하다. 특정 물이 새는 위치 leak[i]까지만 보았을 때, leak[i]가 이미 테이프로 cover되어 있다면 테이프를 붙이지 않는 것이 자원을 가장 아끼는 방법이고, 테이프가 cover되어 있지 않다면 테이프를 가장 많이 남기는 방식으로, 즉 leak[i]-0.5 지점부터 붙이는 것이 가장 자원을 아끼는 방법이다. leak[i]까지만 보았을 때는 이보다 효율적인 방법은 없고, leak[n]까지 이를 반복하면 된다.
시간복잡도는 NlogN + N = O(NlogN)이다.
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
|
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxN = 1050;
int n, l;
int leak[maxN];
int main ( void ) {
int recent = -1;
int cnt = 0;
scanf("%d %d", &n, &l);
for (int i = 0; i < n; i++) scanf("%d", &leak[i]);
sort(leak,leak+n);
for(int i = 0; i < n; i++) {
if(leak[i] <= recent) continue;
recent = leak[i]+ l - 1;
cnt++;
}
printf("%d\n", cnt);
}
|
cs |
'CS > PS' 카테고리의 다른 글
[BOJ] 1028번 : 다이아몬드 광산 (0) | 2021.07.05 |
---|---|
[BOJ] 1005번 : ACM craft (0) | 2021.07.04 |
[BOJ] 1074번 : Z (0) | 2021.07.03 |
[BOJ] 1725번 : 히스토그램 (0) | 2021.07.02 |
[Algospot] 소풍(PICNIC) (0) | 2021.06.16 |