티스토리 뷰
https://www.acmicpc.net/problem/26519
26519번: 함수와 최소 스패닝 트리
첫 번째 줄에 정수 V, E, a가 공백으로 구분되어 주어진다. (1≤V≤100; 1≤E≤250; −1000≤a≤1000; a≠0) 다음 E개의 줄에 간선의 정보를 나타내는 네 정수 X, Y, bi, ci가
www.acmicpc.net
위 문제를 풀다가 정밀도 이슈가 있다고 생각되어 구조체를 이용하여 분수를 구현하였습니다.
ab<cd
우리가 흔히 알고있는 공식을 이용하면 a*d < b*c로 판별할 수 있으나 각각의 변수는 안전하지만 곱하는 순간 오버플로우에 취약합니다.
예를 들어 396519814<478923456
구하기 위해서는
3965∗23456<4789∗19814
와 같이 수가 급격하게 커지게 됩니다. 분수를 기울기로 접근하자면 아래와 같은 그림으로 표현할 수 있습니다.

파랑색의 숫자는 식의 좌항을 표현한 것이고 초록색의 숫자는 우항을 변형하여 나온 숫자입니다.
478923456=3965+82419814+3642
396519814<15and8243642>15
위와 같이 기울기를 통해 대소비교가 가능하며 이점으로는 판별식에서 수가 급격하게 커지는 것을 어느정도 방지할 수 있습니다.
ab<cd={a<c,if b == d(a−c)∗d<c∗(b−d)else if b > da∗(d−b)<(c−a)∗belse
두 분수가 같은지도 응용하면 쉽게 구할 수 있습니다.
[코드]
typedef struct Fraction {
ll numerator; // 분자
ll denominator; // 분모
bool operator < (Fraction rhs) const {
if(denominator == rhs.denominator)
return numerator < rhs.numerator;
if(denominator > rhs.denominator) {
return (numerator-rhs.numerator) * rhs.denominator < (denominator-rhs.denominator) * rhs.numerator;
}
return numerator * (rhs.denominator - denominator) < denominator * (rhs.numerator - numerator);
}
} Fraction;
'알고리즘 공부' 카테고리의 다른 글
[코드포스] 정적배열 사용시 주의할점 (0) | 2023.01.11 |
---|---|
코드포스(Codeforces) D. Lucky Permutation (0) | 2023.01.08 |
- Total
- Today
- Yesterday
- 언리얼 프로젝트 재생성
- 숫자판 만들기
- 정보올림피아드
- BOJ 27469
- C++게임개발
- 코드포스
- ndisplay
- 초등부
- 퀸 움직이기
- 테트리스
- ICPC 후기
- 브레젠험 알고리즘
- 백준 2365
- OpenVDB
- UE5.3
- 백준
- Python
- 언리얼 프로젝트 재생성 자동화
- BOJ 2365
- opengl
- tetris
- Codeforces
- DP
- 홍정모의 게임 만들기 연습 문제 패키지
- pygame
- 백준 27469
- 언리얼 자동화
- unreal enigne
- Unreal Engine
- C++게임
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |