티스토리 뷰

알고리즘/BOJ

[BOJ 17779] 게리맨더링 2

히더 2019. 10. 24. 22:21

백준 :: BOJ :: 17779 :: 게리맨더링 2

 

출처 : https://www.acmicpc.net/problem/17779

 

17779번: 게리맨더링 2

재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름도 재현시로 변경했다. 이번 선거에서는 최대한 공평하게 선거구를 획정하려고 한다. 재현시는 크기가 N×N인 격자로 나타낼 수 있다. 격자의 각 칸은 구역을 의미하고, r행 c열에 있는 구역은 (r, c)로 나타낼 수 있다. 구역을 다섯 개의 선거구로 나눠야 하고, 각 구역은 다

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;

#define F(p,q,r) for(int p=q; p<r; p++)
int N, A[20][20], s, t, ans = 1e5, v, D[4][2] = { {0,-1},{1,0},{0,1},{-1,0} };

int main() {
	cin >> N;
	F(i, 0, N) {
		F(j, 0, N) {
			cin >> A[i][j]; s += A[i][j];
		}
	}
	F(i, 0, N - 2) {
		F(j, 1, N - 1) {
			F(n1, 1, j + 1) {
				F(n2, 1, N-j) {
					if (i + n1 + n2 >= N) break;
					t = s; int B[5] = { 0, }, ma = 0, mi = 1e5,
						C[4][6] = { {0,i+n1,i,0,j+1,N},{0,i+n2+1,i+1,j+1,N,N},
					{i+n1,N,0,0,j-n1-1,i+n1+n2+1},{i+n2+1,N,0,j+n2+1,N,i+n1+n2+2} };
					F(k, 0, 4) {
						v = 0; F(y, C[k][0], C[k][1]) {
							if (y >= C[k][2] && y<C[k][5]) v++;
							int c1 = C[k][3] + D[k][0]*v, c2= C[k][4] + D[k][1]*v;
							F(x, c1, c2) B[k] += A[y][x];
						}
						ma = max(ma, B[k]); mi = min(mi, B[k]); t -= B[k];
					} ma = max(ma, t); mi = min(mi, t);
					ans = min(ans, ma-mi);
				}
			}
		}
	}
	cout << ans;
	return 0;
}

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

[BOJ 17837] 새로운 게임 2  (0) 2019.11.06
[BOJ 17142] 연구소 3  (0) 2019.09.18
[BOJ 17140] 이차원 배열과 연산  (0) 2019.09.18
[BOJ 17143] 낚시왕  (0) 2019.05.14
[BOJ 17144] 미세먼지 안녕!  (2) 2019.05.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함