레이스(이분 탐색, 그리디)
2023. 5. 17. 11:55ㆍC++/알고리즘
https://www.acmicpc.net/problem/1508
1508번: 레이스
첫째 줄에 N, M, K가 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, M은 K보다 작거나 같다. 또, K는 2보다 크거나 같고, 50보다 작거나 같다. 둘째 줄에 심판이 있을 수 있는 K개의 위치가 주어
www.acmicpc.net
https://djgameprogramming.tistory.com/117
공유기 설치(이분 탐색, 그리디)
https://www.acmicpc.net/problem/2110 2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집
djgameprogramming.tistory.com
공유기 설치 문제와 거의 동일하게 접근하면 된다.
M개라는 설치 제한이 있으므로 제한 이후의 지점은 전부 설치가 불가능 함에 유의하여야 한다.
간격 값이 아닌 설치 현황을 제시하는 문제이므로
최대 간격 값이 업데이트 될때마다 설치 현황도 같이 업데이트 해주어야 한다.
공유기 설치 문제와 다른 부분은 주석처리를 해놓았다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int N, M, K;
vector<int> Race;
bool Check[50];
// 간격에 따른 설치지점을 저장할 배열
int Solve(int mid)
{
int ret = 1;
int pre = Race[0];
memset(Check, 0, sizeof(Check));
Check[0] = true;
for (int i = 1; i < K; i++)
{
if (Race[i] - pre >= mid)
{
ret++;
Check[i] = true;
if (ret == M) break; // 설치 제한 존재함
pre = Race[i];
}
}
return ret;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M >> K;
int cmd = K;
while (cmd--)
{
int tmp;
cin >> tmp;
Race.push_back(tmp);
}
int ret = 0;
bool Ans[50] = { 0, }; // 답으로 제시할 배열
int s = 1;
int e = Race.back() - Race.front();
while (s <= e)
{
int mid = ((s + e) / 2);
if (Solve(mid) == M)
{
if (ret < mid)
{
ret = mid;
memcpy(Ans, Check, sizeof(Ans));
// 설치한 공간을 업데이트
}
s = mid + 1;
}
else e = mid - 1;
}
for (int i = 0; i < K; i++)
{
cout << (Ans[i]) ? 1 : 0;
}
}
'C++ > 알고리즘' 카테고리의 다른 글
의상(해시, 조합 접근법) (0) | 2023.07.21 |
---|---|
Quick Sort (0) | 2023.05.22 |
공유기 설치(이분 탐색, 그리디) (0) | 2023.05.17 |
계단 수(DP) (0) | 2023.05.15 |
여행(DP) (0) | 2023.05.11 |