반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- incr
- 매개변수탐색
- Kafka
- BOJ
- 백트래킹
- 물채우기
- 백준
- compose
- boj #19237 #어른 상어
- 연결요소
- 퇴사통보
- 성적평가
- 이분탐색
- 소프티어
- upper_bound
- @P0
- dfs
- msSQL
- BFS
- 경력
- 6987
- 오퍼레터
- 파라메트릭
- OFFSET
- 기술면접
- Docker
- 처우협의
- 처우산정
- 13908
- softeer
Archives
- Today
- Total
기술 블로그
1911번 흙길 보수하기 본문
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 <= 0) continue; 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 |