백준: Class 6 - 16565, 17371

1 분 소요


</br> 클래스 6 계속
</br>

16565: N포커

https://www.acmicpc.net/problem/16565

#include <bits/stdc++.h>

using namespace std;

int nCr[53][53];

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

    int n;
    cin >> n;

    if( n < 4 ){
        cout << 0 << endl;
        return 0;
    }
    nCr[0][0] = 1;
    for(int i = 1; i <= 52; i++){
        nCr[i][0] = 1;
        for(int j = 1; j <= i; j++){
            nCr[i][j] = nCr[i-1][j-1] + nCr[i-1][j];
            nCr[i][j] %= 10007;
        }
    }

    int ans = 0;
    int isMinus = 1;
    for(int i = 4; i <= n; i+=4){
        ans += isMinus * nCr[13][i/4] * nCr[52-i][n-i];
        isMinus *= -1;
    }

    cout << ((ans % 10007) + 10007) % 10007 << endl;

}

와~~ 어렵다 오랜만에 고딩 때 확통이 생각난다
아무래도 조합이 쓰일 일이 많을 것 같아서 미리 구해놨다.
같은 카드 4장 이상 있으면 되므로, 포문을 4 기준으로 돌았다.
만약 4장이 한 번 있다면 13문양 중 하나를 고르므로 13C1이고, 4장을 이미 골랐으므로 52장 중 4장을 빼고, 고를 n장 중 4장을 뺀 (52-4)C(n-4)를 곱한다.
수식으로 쓰면 nCr[13][i/4] * nCr[52-i][n-i] 이렇게 된다.
그런데 이러면 중복된 경우도 들어간다!!
4장이 한 번인 경우에 두 번, 세 번인 경우들도 다 들어간다는 거다.
그래서 번갈아 가며 더하고 빼고 해주니까 맞았다.
</br>

17371: 이사

https://www.acmicpc.net/problem/17371

#include <bits/stdc++.h>

using namespace std;

int x[1001];
int y[1001];

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

    int n;
    cin >> n;

    for(int i = 0; i < n; i++){
        cin >> x[i] >> y[i];
    }

    int minl = INT_MAX;
    int ansi;
    for(int i = 0; i < n; i++){
        int maxt = 0;
        for(int j = 0; j < n; j++){
            if( i == j ) continue;
            int tx = x[i]-x[j];
            int ty = y[i]-y[j];
            int t = tx*tx + ty*ty;
            maxt = max(maxt, t);
        }
        if( maxt < minl ){
            minl = maxt;
            ansi = i;
        }
    }

    cout << x[ansi] << ' ' << y[ansi] << '\n';

}

처음엔 문제를 보고, 가장 긴 거리의 가운데인가? 했는데 그거도 아니고…
그래서 일단 점 1개일 때를 생각하니까 그냥 거기에 지으면 된다
그리고 점 2개일 때를 보니까

A------B 면  
A와 B 사이 어디를 해도 거리 평균은 같음

그럼 대충 그냥 편의시설 위에다 지어도 되는 걸까??
그렇게 코드 짜 보니까 맞았다네
증명은 잘 못하겠다
</br>


수학 쪽을 약간 때려 맞춘다

</br>

댓글남기기