백준: Class 6 - 16565, 17371
</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>
댓글남기기