[SWEA] 1494 : 사랑의 카운슬러

1494 : 사랑의 카운슬러

풀이

백트래킹

D4

n범위가 20까지지만 next_permutation(v.begin+n/2,v.end()) 이렇게 하면

n이 20일때 10부터 19까지만 순열도니까 괜찮지 않을까 해서 퍼뮤테이션으로 비벼봤는데,

시간초과로 안된당…ㅠ 왜안되는지 설명해줄사람 -()/ !!

그래서 n이 20일때 2^n까지 허용되므로

하나씩 넣었다가 빼보는 방법(백트래킹)으로 다시풀었다.

퍼뮤테이션과 이방법이 시간차이가 별로 안난다고 생각헀는데 차이가 꽤 크구나.

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
using namespace std;

int arr[20][2];
int chk[20];
long long ans=-1;
int n;
void go(int idx,int cnt) {
    //종료조건
    if (cnt == n / 2) {
        long long xsum=0, ysum = 0;
        for (int i = 0; i < n; i++) {
            if (chk[i] == 1) {
                xsum += arr[i][0];
                ysum += arr[i][1];
            }
            else {
                xsum -= arr[i][0];
                ysum -= arr[i][1];
            }
        }
        if (ans == -1 || xsum*xsum + ysum*ysum < ans) {
            ans = xsum*xsum + ysum*ysum;
        }
        return;
    }

    for (int i = idx; i < n; i++) {
        if (chk[i] == 0) {
            chk[i] = 1;
            go(i + 1, cnt + 1);
            chk[i] = 0;
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int T;
    cin >> T;
    for (int tc = 1; tc <= T; tc++) {
        ans = -1;
        memset(chk, 0, sizeof(0));
        cin >> n;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 2; j++) {
                cin >> arr[i][j];
            }
        }
        go(0,0);
        cout << "#" << tc << ' ' << ans << '\n';
    }
    return 0;
}
Written on April 5, 2019