2020. 8. 26. 23:48ㆍPS/Geometry
풀이 올려놓는다고 2달 전에 했던 거 같은데 아직도 안 풀어서 이제야 올린다.
A. 원의 분할
https://www.acmicpc.net/problem/16478
중3 수학만 알아도 껌 같은 문제.
자세한 설명은 생략한다.
#include <bits/stdc++.h>
#define MEM 200004
#define sanic ios_base::sync_with_stdio(0)
#define MOD 1000000007
#define f first
#define s second
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
ll n,m,k;
int main(){
cin >> n >> m >> k;
cout.precision(7);
cout << fixed;
cout << (n*k*1.0)/m/1.0;
return 0;
}
B. 컵라면 측정하기
https://www.acmicpc.net/problem/16479
피타고라스 정리를 이용한다. A번보다 더 심하게 껌 같은(?) 문제
#include <bits/stdc++.h>
#define MEM 200004
#define sanic ios_base::sync_with_stdio(0)
#define MOD 1000000007
#define f first
#define s second
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
ll n,m,k;
int main(){
cin >> n >> m >> k;
cout.precision(7);
cout << fixed;
cout << n*n-((m-k)/2.0)*((m-k)/2.0);
return 0;
}
C. 외심과 내심은 사랑입니다.
https://www.acmicpc.net/problem/16480
외심과 내심의 거리를 구하는 문제이다.
이는 오일러 삼각형 정리라고 아주 널리 알려져 있다.
d=외심과 내심의 거리, R=외접원 반지름, r=내접원 반지름
d^2=R(R-2r)이 성립한다.
#include <bits/stdc++.h>
#define MEM 10004
#define sanic ios_base::sync_with_stdio(0)
#define pb push_back
#define f first
#define s second
using namespace std;
typedef long long ll;
const ll mod = 1000000007LL;
const ll INF = 1e9+7;
ll R,r;
main() {
sanic;
cin >> R >> r;
cout << R*(R-2*r);
}
D. 원 전문가 진우
https://www.acmicpc.net/problem/16481
루리에 정리를 이용하면 쉽게 풀 수 있다.
r1,r2,r3=각 방접원의 반지름, r=내접원의 반지름
#include <bits/stdc++.h>
#define MEM 200004
#define sanic ios_base::sync_with_stdio(0)
#define MOD 1000000007
#define f first
#define s second
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
ll n,m,k;
int main(){
cin >> n >> m >> k;
cout.precision(7);
cout << fixed;
cout << (n*m*k*1.0)/(n*m+m*k+k*n);
return 0;
}
E. 한 점에서 만나라
https://www.acmicpc.net/problem/16482
체바 정리로 짜증나게(?) 풀 수 있다.
식 정리 귀찮다.
a,b,c = 문제에 나온 대로 정의, 선분 AF = d, 선분 BD = e, 선분 CE = f
#include <bits/stdc++.h>
#define MEM 10009
#define sanic ios_base::sync_with_stdio(0)
#define pb push_back
using namespace std;
typedef int ll;
typedef pair<ll, ll> pii;
const ll MOD = 1e9+7;
ll n,a,b,c,d,e;
int main()
{
cin >> a >> b >> c >> d >> e;
cout.precision(7);
cout << fixed << (double)(b*(c-d)*(a-e)*1.0/(d*e*1.0+(c-d)*(a-e)*1.0));
}
F. 접시 안의 원
https://www.acmicpc.net/problem/16483
그냥 피타고라스 정리 문제이다.
정의는 문제 설명대로 한다.
#include <bits/stdc++.h>
#define MEM 10009
#define sanic ios_base::sync_with_stdio(0)
#define pb push_back
using namespace std;
typedef int ll;
typedef pair<ll, ll> pii;
const ll MOD = 1e9+7;
ll n;
int main()
{
cin >> n;
cout << n*n/4;
}
G. 작도하자! - ①
https://www.acmicpc.net/problem/16484
나비 정리를 써서 PM=MQ이다.
그러므로 QY의 길이를 구할 수 있다.
문제에서 정의한 문자대로 하면
QY의 길이 = (n-d*2)/2
#include <bits/stdc++.h>
#define MEM 200004
#define sanic ios_base::sync_with_stdio(0)
#define MOD 1000000007
#define f first
#define s second
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
ll n,m,k;
int main(){
cin >> n >> m;
cout.precision(1);
cout << fixed;
cout << (n-m*2)/2.0;
return 0;
}
H. 작도하자! - ②
https://www.acmicpc.net/problem/16485
중2 수학에서 각의 이등분선 정리를 알면 꿀인 문제.
#include <bits/stdc++.h>
#define MEM 100001
#define sanic ios_base::sync_with_stdio(0)
using namespace std;
typedef unsigned long long ull;
typedef pair<int, int> pi;
typedef pair<int, pair<int, int>> pii;
int par[MEM], a, b, ans;
int main()
{
sanic;
cin >> a >> b;
cout.precision(10);
cout << fixed << a/(b*1.0);
}
I. 운동장 한 바퀴
https://www.acmicpc.net/problem/16486
초등학교 5학년 이상이면 다 알거라 믿는다. ㅎ
#include <bits/stdc++.h>
#define MEM 100001
#define sanic ios_base::sync_with_stdio(0)
using namespace std;
int a, b;
int main(){
cin >> a >> b;
cout.precision(6);
cout << fixed << a*2+2*b*3.141592;
return 0;
}
J. 말 타기
https://www.acmicpc.net/problem/16487
스튜어트 정리를 이용해 짜증나게(?) 풀어주면 된다.
식 정리 귀찮다.
#include <bits/stdc++.h>
#define MEM 10009
#define sanic ios_base::sync_with_stdio(0)
#define pb push_back
using namespace std;
typedef int ll;
typedef pair<ll, ll> pii;
const ll MOD = 1e9+7;
ll n,a,b,c,m;
int main()
{
cin >> a >> b >> c >> m;
n = b-m;
cout.precision(7);
cout << fixed << (double)(((c*c*m+a*a*n)*1.0/b*1.0)-m*n*1.0);
}
K. 피카츄가 낸 어려운 문제
https://www.acmicpc.net/problem/16488
#include <bits/stdc++.h>
#define sanic ios_base::sync_with_stdio(0);
#define MEM 1000090
#define f first
#define s second
using namespace std;
typedef long long ll;
typedef pair<ll, ll> p;
ll n,t;
int main(){
sanic; cin.tie(0);
cin >> n >>t;
cout << n*n*t;
}
L. 삼각형 해커
https://www.acmicpc.net/problem/16489
진짜 풀이 쓰기 싫은 문제다.
각 소문제별로 풀이한다.
S -> 헤론의 공식. (삼각형의 세 변의 길이가 주어졌을 때 그 넓이를 구하는 공식)
R ->
R = 외접원의 반지름, a,b,c=각 변의 길이, S=넓이
사인 법칙만을 이용하는 게 편한데 실수 오차 + 사인 함수 구현 싫증 때문에 식을 변형했다.
r -> 간단한 식정리다. 중학 도형을 배웠다면 알 거라 생각한다.
d -> 오일러의 삼각형 정리
R = 외접원의 반지름, r = 내접원의 반지름, d = 외심과 내심 사이의 거리
위 그림에서 식은 R>=2r일 때만 성립한다.
R<2r이 아닐 때 0을 출력해주면 된다.
k->카르노의 정리에 의해 k=R+r
아 그리고 이 문제 진짜 더럽다. 그래서 python decimal을 써서 풀었다.
from decimal import *
import math
getcontext()
getcontext().prec = 14
a,b,c = map(Decimal, input().split())
s=(a+b+c)/2
S=Decimal(str(math.sqrt(s*(s-a)*(s-b)*(s-c))));
print(math.sqrt(s*(s-a)*(s-b)*(s-c)))
print(a*b*c/(4*S))
print(2*S/(a+b+c))
d=(a*b*c/(4*S)-(4*S/(a+b+c)))
if d<=0 :
d=0
else :
d=math.sqrt(a*b*c/(4*S)*d)
print(d)
print(a*b*c/(4*S)+2*S/(a+b+c))
M. 외계인의 침투
https://www.acmicpc.net/problem/16490
중학교 3학년 2학기 에이급 문제집을 비슷한 문제가 있는 것 같아서 손쉽게 풀 수 있었다.
삼각형 ABP를 60도 돌리면 삼각형 ACE가 되고 삼각형 APE는 정삼각형이 된다.
정삼각형이 되는 이유는 삼각형 ABP와 삼각형 ACE가 합동이므로 각 PAE가 60도, 선분 AP, AE가 같기 때문이다.
#include <bits/stdc++.h>
#define MEM 8001
#define sanic ios_base::sync_with_stdio(0)
#define MOD 1000000
#define f first
#define s second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
double a,b,c;
int main(){
sanic;
cin >> a >> b;
cout << a*a-b*b;
}
모든 문제가 기하였고, 개인적으로 E, J, L이 제일 힘들었던 것 같다.
사실 제일 힘든게 이 글 쓰는 것이었다 진짜 뒤지는 줄