기술 블로그

1911번 흙길 보수하기 본문

알고리즘 문제/BOJ

1911번 흙길 보수하기

parkit 2020. 1. 10. 14:02
728x90
반응형

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




# 복습

# 코딩

# 코테

# 문제

# 그리디(Greedy)




처음에는 


6 - 1 = 5

17 - 13 = 4

12 - 8 = 4


합은 13이고 13/3 = 4.** = 4,

나머지가 있으므로 5


이렇게 생각했는데 그게 아니었다.



(반례)

2 2

1 2

3 4

2






주석을 참고.


핵심 : 널빤지를 어느 (시작) 위치에 설치를 할 것인가? 물웅덩이의 시작 좌표와 함께 고려하기


단순하면서도 생각을 조금 요구하는 문제.





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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.io.*;
import java.util.*;
 
public class Main {
    
    static int N;
    static long ans = 0, L;
    static Vector<Pair> v = new Vector<Pair>();
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        N = Integer.parseInt(st.nextToken());
        L = Long.parseLong(st.nextToken());
        
        for(int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());            
            long f = Long.parseLong(st.nextToken());
            long s = Long.parseLong(st.nextToken());
            v.add(new Pair(f, s));
        }
        
        Collections.sort(v, new Comparator<Pair>() {
            public int compare(Pair a, Pair b) {
                return Long.compare(a.first, b.first);
            }
        });
        
        long here = 0// 널빤지의 끝 위치(오른쪽)
        
        for(int i = 0; i<v.size(); i++) {
            
            long len1 = v.get(i).second - v.get(i).first; // here이 v.get(i).first보다 작거나 같을 때
            long len2 = v.get(i).second - here; // here이 v.get(i).first보다 클 때
            long cnt = 0;
            
            // 0이 나오면 진행할 필요가 없음.(덮으므로)
            if(len1 <= 0 || len2 <= 0continue;
                    
            if(here <= v.get(i).first) {
                // 현재 널빤지의 오른쪽 끝이 현재 물웅덩이 시작점보다 작거나 같다면
                here = v.get(i).first; // here의 위치를 옮긴다. 
                cnt = len1/L; // 널빤지 개수 구하기(원래의 물웅덩이 길이를 고려)
                if(len1 % L != 0++cnt; // 나머지가 있다면 널빤지 1개 추가)
            }
            else {
                // 현재 널빤지의 오른쪽 끝이 현재 물웅덩이 시작점보다 크다면
                cnt = len2/L; // 널빤지 개수 구하기(물웅덩이의 시작  부분의 일부를 덮은 here를 고려)
                if(len2 % L != 0++cnt; // 나머지가 있다면 널빤지 1개 추가)
            }        
            
            here += cnt * L; // 설치한 널빤지의 총 길이를 here에 더함
            ans += cnt;
        }
            
        bw.write(String.valueOf(ans) + "\n");
        bw.flush();
        bw.close();
    }
}
 
class Pair{
    long first, second;
    Pair(long f, long s) {
        this.first = f;
        this.second = s;
    }
}
cs










































728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

1748번 수 이어 쓰기 1  (0) 2020.01.12
3049번 다각형의 대각선  (0) 2020.01.10
1459번 걷기  (0) 2020.01.10
2212번 센서  (0) 2020.01.09
10165번 버스 노선  (0) 2020.01.08