문제링크
https://www.acmicpc.net/problem/1064
1064번: 평행사변형
평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC) 이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나
www.acmicpc.net
문제
평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC)
이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나올 수도 있다.
만들어진 모든 사각형 중 가장 큰 둘레 길이와 가장 작은 둘레 길이의 차이를 출력하는 프로그램을 작성하시오. 만약 만들 수 있는 평행사변형이 없다면 -1을 출력한다.
입력
첫째 줄에 xA yA xB yB xC yC가 주어진다. 모두 절댓값이 5000보다 작거나 같은 정수이다.
출력
첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.
해석
점 A, B, C 사이의 거리를 AB, BC, AC라고 했을 때
둘레가 가장 길 때는 AB, BC, AC중 긴 두개의 변을 이용하여 평행사변형을 만드는 경우
둘레가 가장 짧을 때는 AB, BC, AC중 짧은 두개의 변을 이용하여 평행사변형을 만드는 경우다.
즉, 둘레의 차이는 (가장 긴 변의 길이 - 가장 짧은 변의 길이)*2 가 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;
double answer(int x1, int y1, int x2, int y2, int x3, int y3) {
if ((x1 - x2) * (y1 - y3) == (x1 - x3) * (y1 - y2)) {
return -1;
}
else {
vector<double> distance;
double distance12 = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
double distance23 = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3));
double distance13 = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
distance.push_back(distance12);
distance.push_back(distance13);
distance.push_back(distance23);
sort(distance.begin(), distance.end());
double maxdis = distance[2];
double mindis = distance[0];
return 2 * (maxdis) - 2 * (mindis);
}
}
int main() {
int x1, y1;
int x2, y2;
int x3, y3;
cout << fixed;
cout.precision(16);
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
cout << answer(x1, y1, x2, y2, x3, y3);
}
|
cs |
Memo
문제를 다 풀어놓고 오차를 생각하지 않고 출력해서 여러번 틀렸다.
cout<<fixed;
cout<<precision(16);
위 2줄의 코드가 16자리까지 출력되도록 도와준다.