백준 1911번
백준 1911번
흙길 보수하기
시간 제한 : 2 초 메모리 제한 : 128 MB
문제
어젯밤 겨울 캠프 장소에서 월드 본원까지 이어지는, 흙으로 된 비밀길 위에 폭우가 내려서 N(1 ≤ N ≤ 10,000)개의 물웅덩이가 생겼다. 월드학원은 물웅덩이를 덮을 수 있는 길이가 L(1 ≤ L ≤ 1,000,000)인 널빤지들을 충분히 가지고 있어서, 이들로 다리를 만들어 물웅덩이들을 모두 덮으려고 한다. 물웅덩이들의 위치와 크기에 대한 정보가 주어질 때, 모든 물웅덩이들을 덮기 위해 필요한 널빤지들의 최소 개수를 구하여라.
입력
첫째 줄에 두 정수 N과 L이 들어온다.
둘째 줄부터 N+1번째 줄까지 총 N개의 줄에 각각의 웅덩이들의 정보가 주어진다. 웅덩이의 정보는 웅덩이의 시작 위치와 끝 위치로 이루어진다. 각 위치는 0 이상 1,000,000,000 이하의 정수이다. 입력으로 주어지는 웅덩이는 겹치지 않는다.
출력
첫째 줄에 모든 물웅덩이들을 덮기 위해 필요한 널빤지들의 최소 개수를 출력한다.
해설
이 문제는 웅덩이를 덮는데 필요한 최소한의 널빤지 수를 구하는 문제입니다. 주어진 웅덩이들의 위치와 크기, 그리고 널빤지의 길이를 사용하여 웅덩이를 덮을 때 필요한 최소한의 널빤지를 계산합니다.
문제 해결 방법은 다음과 같습니다:
- 웅덩이 정렬: 먼저 웅덩이의 시작 위치에 따라 웅덩이를 정렬합니다. 시작 위치가 같은 경우에는 끝 위치에 따라 정렬합니다.
- 널빤지 배치: 웅덩이를 차례대로 확인하면서 각 웅덩이에 널빤지를 배치합니다. 만약 현재의 웅덩이가 이전에 놓인 널빤지에 의해 이미 덮여 있으면 (이전 널빤지의 끝 위치가 현재 웅덩이의 끝 위치보다 크거나 같은 경우), 현재 웅덩이에 추가적인 널빤지를 놓을 필요가 없습니다. 그렇지 않은 경우에는 현재 웅덩이를 덮기 위해 필요한 널빤지의 개수를 계산하고, 해당 개수만큼 널빤지를 놓습니다.
- 결과 출력: 모든 웅덩이를 확인한 후, 놓인 널빤지의 총 개수를 출력합니다. 다음과 같은 방법으로 웅덩이를 덮는데 필요한 최소한의 널빤지 수를 구할 수 있습니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef struct line {
int s;
int e;
} Line;
int compare(const void* a, const void* b) {
Line num1 = *(Line*)a;
Line num2 = *(Line*)b;
if (num1.s > num2.s)
{
return 1;
}
else if (num1.s == num2.s)
{
if (num1.e > num2.e)
{
return 1;
}
else {
return -1;
}
}
return -1;
}
int main()
{
int a, b;
scanf("%d %lld", &a, &b);
Line line[a];
for (int i = 0; i < a; i++)
{
scanf("%d %d", &line[i].s, &line[i].e);
}
qsort(line, a, sizeof(Line), compare);
int count = 0, block = 0;
for (int i = 0; i < a; i++)
{
if (block >= line[i].e)
{
continue;
}
if (block < line[i].s)
{
block = line[i].s;
}
int cnt = (line[i].e - (block + 1)) / b + 1;
count += cnt;
block += b * cnt;
}
printf("%d", count);
}
Written on June 24, 2023