어흥
[백준 17779] 게리맨더링 2 (C++) 본문
728x90
반응형
문제 링크: https://www.acmicpc.net/problem/17779
17779번: 게리맨더링 2
재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름��
www.acmicpc.net
1. 주의할 점
- 각 구역을 어떤 방식으로 나눌건지 잘 계산한다
- 브루트포스를 통해 경우의 수 전부 구해본다
2. 구현
- 각 인구를 입력 받으면서 배열에서의 총합을 따로 구한다
- D1, D2의 최소 길이가 1인 것을 감안하여 DFS를 수행한다
- DFS를 수행하며 각 변이 범위밖으로 넘어가지 않는다면 브루트포스 함수인 Start()를 수행한다
- 1~4 구역까지 인구수 전부 구한 후, 5구역은 전체 인구수에서 1~4구역을 합한만큼 빼서 구한다
- 각 지역의 최고 인구수와 최소 인구수의 차이를 구하여 Result와 비교한다
#define MAX 987654321
#include <iostream>
#include <algorithm>
using namespace std;
int arr[20][20],dup[20][20];
int num, result = MAX, tot = 0;
int pop[6];
void start(int y, int x, int d1, int d2) {
for (int i = 1; i < 6; i++)
pop[i] = 0;
int maxi = 0, mini = MAX;
for (int i = 0; i < num; i++)
for (int j = 0; j < num; j++)
dup[i][j] = 5;
//1구역
for (int i = 0; i < y; i++) {
for (int j = 0; j <= x+d1; j++) {
if (x + y == i + j) break;
else {
dup[i][j] = 1;
pop[1] += arr[i][j];
}
}
}
//2구역
for (int i = 0; i <= y+d2-d1; i++) {
for (int j = x+d1+1; j < num; j++) {
if (i - j >= y - x - 2 * d1) continue;
else {
dup[i][j] = 2;
pop[2] += arr[i][j];
}
}
}
//3구역
for (int i = y; i <num; i++) {
for (int j = 0; j < x+d2; j++) {
if (i - j == y - x) break;
else {
dup[i][j] = 3;
pop[3] += arr[i][j];
}
}
}
//4구역
for (int i = y + d2-d1+1; i <num; i++) {
for (int j = x+d2; j < num; j++) {
if (i + j <= x + y + 2 * d2) continue;
else {
dup[i][j] = 4;
pop[4] += arr[i][j];
}
}
}
pop[5] = tot - (pop[1] + pop[2] + pop[3] + pop[4]);
for (int i = 1; i < 6; i++) {
maxi = max(maxi, pop[i]);
mini = min(mini, pop[i]);
}
result = min(result, maxi - mini);
}
void dfs(int y, int x) {
for (int i = 1; i < num; i++) { //d1
for (int j = 1; j < num; j++) { //d2
if (y - i >= 0 && y + j < num && x + i + j < num)
start(y, x, i, j);
}
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> num;
for (int i = 0; i < num; i++)
for (int j = 0; j < num; j++) {
cin >> arr[i][j];
tot += arr[i][j];
}
for(int i=1;i<num-1;i++)
for (int j = 0; j < num - 2; j++) {
dfs(i, j);
}
cout << result;
return 0;
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 17822] 원판 돌리기 (C++) (0) | 2020.06.06 |
---|---|
[백준 17837] 새로운 게임 2 (C++) (0) | 2020.06.06 |
[백준 15661] 링크와 스타트 (C++) (0) | 2020.06.03 |
[백준 2549] 루빅의 사각형 (C++) (0) | 2020.06.02 |
[백준 13905] 세부 (C++) (0) | 2020.06.02 |
Comments