레야몬

[C++] 1007번 벡터 매칭 - 수학, 브루트포스 본문

알고리즘/백준

[C++] 1007번 벡터 매칭 - 수학, 브루트포스

Leyamon 2022. 10. 7. 21:30
#include <iostream>
#include <algorithm>
#include <math.h>
#include <vector>

#define FOR(i, k, N) for(int i=k; i<=N; i++)
#define MAX_N 21
#define X first
#define Y second
#define INF 987654321

using namespace std;
typedef long long ll;

int T, N;  //테스트 케이스의 개수 T, 점의 개수 N
double sum;  //최소 거리
vector<pair<int, int>> loc;

void f(int n, int s, int us, ll vx, ll vy)
{
    if(n==N+1) sum = min(sum, sqrt(vx*vx+vy*vy));
    
    if(s<N/2) f(n+1, s+1, us, vx+loc[n].X, vy+loc[n].Y);  //2개 중 하나 선택
    if(us<N/2) f(n+1, s, us+1, vx-loc[n].X, vy-loc[n].Y);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cout.precision(30);
    
    cin >> T;
    
    while(T--) {
        sum=INF;
        
        cin >> N;
        loc.push_back({0, 0});
        FOR(i, 1, N) {
            int x, y; cin >> x >> y;
            loc.push_back({x, y});
        }
        
        f(1, 0, 0, 0, 0);
            
        cout << sum << '\n';
            
        loc.clear();
    }
    
    return 0;
}

<알고리즘>

  1. 벡터들의 합은 좌표의 합으로 나타낼 수 있다.
  2. N개중 N/2를 시작점 N/2를 종점으로 하자.

 

 

 

 

 

 

<cout 소수점 정하는 법>

https://hashcode.co.kr/questions/405/cout%EC%9D%84-%EC%8D%A8%EC%84%9C-%EC%B6%9C%EB%A0%A5%ED%95%A0-%EB%95%8C-double%EC%A0%84%EC%B2%B4%EB%A5%BC-%ED%94%84%EB%A6%B0%ED%8A%B8%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4%EC%9A%94

 

cout을 써서 출력할 때 `double`전체를 프린트하고 싶어요

제가 밑의 소스코드를 실행하면 3.14159265358979가 아니라 3.14159로 나오는데 이렇게 소수점에서 반올림한 거 말고 전체 값이 다 나오게 하려면 어떻게 해야 되돼나요? 소스코드 int main(){ double d = 3.14

hashcode.co.kr

 

 

 

 

 

 

※현재 고등학교 등교 중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고 있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.

Comments