알고리즘/BOJ

백준 11377번 열혈강호 3

꾸준함. 2020. 8. 24. 10:51

문제 링크입니다: https://www.acmicpc.net/problem/11377

 

11377번: 열혈강호 3

첫째 줄에 직원의 수 N과 일의 개수 M, 일을 2개할 수 있는 직원의 수 K가 주어진다. (1 ≤ N, M ≤ 1,000, 1 ≤ K ≤ N) 둘째 줄부터 N개의 줄의 i번째 줄에는 i번 직원이 할 수 있는 일의 개수와 할 수 있

www.acmicpc.net

열혈강호 2(https://jaimemin.tistory.com/1512)와 유사한 문제였습니다.

이 문제에서는 N명 중에서 K명만 일을 최대 두 개 할 수 있고 나머지 직원은 한 개의 일을 할 수 있으므로 열혈강호 2처럼 직원의 수를 두배로 늘리되 우선 짝수번째 인덱스에 있는 직원을 먼저 업무에 배치를 하고 이후에 홀수번째 인덱스에 있는 직원 중 K명을 다른 업무에 배치를 해줍니다.

 

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAX = 1e3 * 2 + 1;
int N, M, K;
vector<int> works[MAX];
int worker2work[MAX], work2worker[MAX];
bool visited[MAX];
bool func(int worker)
{
for (int workNum : works[worker])
{
if (visited[workNum])
{
continue;
}
visited[workNum] = true;
if (work2worker[workNum] == -1 || func(work2worker[workNum]))
{
worker2work[worker] = workNum;
work2worker[workNum] = worker;
return true;
}
}
return false;
}
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> K;
for (int i = 0; i < N; i++)
{
int cnt;
cin >> cnt;
for (int j = 0; j < cnt; j++)
{
int work;
cin >> work;
works[i * 2].push_back(work - 1);
works[i * 2 + 1].push_back(work - 1);
}
}
memset(worker2work, -1, sizeof(worker2work));
memset(work2worker, -1, sizeof(work2worker));
int result = 0;
for (int worker = 0; worker < N * 2; worker += 2)
{
if (worker2work[worker] == -1)
{
memset(visited, false, sizeof(visited));
if (func(worker))
{
result++;
}
}
}
int specialWorkers = 0;
for (int worker = 1; worker < N * 2; worker += 2)
{
if (worker2work[worker] == -1)
{
memset(visited, false, sizeof(visited));
if (func(worker))
{
result++;
specialWorkers++;
if (specialWorkers == K)
{
break;
}
}
}
}
cout << result << "\n";
return 0;
}
view raw .cpp hosted with ❤ by GitHub

개발환경:Visual Studio 2017

 

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

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

백준 10837번 동전 게임  (0) 2020.09.03
백준 11378번 열혈강호 4  (0) 2020.08.27
백준 11376번 열혈강호 2  (0) 2020.08.23
백준 1052번 물병  (4) 2020.08.21
백준 2160번 그림 비교  (0) 2020.08.09