일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 게임 서버 아키텍처
- pm2
- PROJECT
- map
- Express.js
- JavaScript
- router
- Github
- 자바스크립트
- koi 2002 중등부 1번
- MongoDB
- insomnia
- ccw 알고리즘
- Prisma
- HTTP
- 백준 28298번
- 더 흔한 색칠 타일 문제
- localstorage
- 백준 2623번
- ucpc 2024 예선 e번
- MySQL
- ucpc 2023 예선 i번
- Next
- 백준 28303번
- string
- html5
- ERD
- branch
- 그리디
- ucpc 2023 예선 d번
Archives
- Today
- Total
dh_0e
[PS] N수매화검법 / C++ (백준 25315번) 본문
2022 UCPC 예선 B번, 그리디로 풀 수 있는 선분 교차 판정 문제로, N <= 2500 이므로 O($n^{2}$)도 가능하다.
해결 방법
가중치를 기준으로 정렬한 뒤 가중치가 낮은 베기부터 ccw 알고리즘으로 교차되는 선분의 개수를 구하여 가중치에 곱한 값을 모두 더하여 답을 도출했다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
struct Point {
ll x1, y1, x2, y2, w, m;
};
bool cmp(struct Point a, struct Point b) {
return a.w < b.w;
}
Point d[2501];
int ccw(ll x1, ll y1, ll x2, ll y2, ll x3, ll y3) {
ll temp = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
if (temp < 0)return -1;
if (temp > 0)return 1;
return 0;
}
bool isIntersect(ll x1, ll y1, ll x2, ll y2, ll x3, ll y3, ll x4, ll y4) {
int ccw1 = ccw(x1, y1, x2, y2, x3, y3);
int ccw2 = ccw(x1, y1, x2, y2, x4, y4);
int ccw3 = ccw(x3, y3, x4, y4, x1, y1);
int ccw4 = ccw(x3, y3, x4, y4, x2, y2);
return (ccw1 * ccw2 < 0) && (ccw3 * ccw4 < 0);
}
int main() {
ll n, dap = 0;
scanf("%lld", &n);
for (int i = 0; i < n; i++) {
scanf("%lld %lld %lld %lld %lld", &d[i].x1, &d[i].y1, &d[i].x2, &d[i].y2, &d[i].w);
}
sort(d, d + n, cmp);
for (int i = 0; i < n; i++) {
d[i].m = 0;
for (int j = i + 1; j < n; j++) {
if (isIntersect(d[j].x1, d[j].y1, d[j].x2, d[j].y2, d[i].x1, d[i].y1, d[i].x2, d[i].y2)) {
d[i].m++;
}
}
dap += d[i].w * (d[i].m + 1);
}
printf("%lld\n", dap);
return 0;
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[PS] 지금 자면 꿈을 꾸지만 / C++ (백준 32029번) (0) | 2024.08.21 |
---|---|
[PS] 이진 검색 트리 복원하기 / C++ (백준 32028번) (0) | 2024.08.20 |
[PS] 세미나 배정 / C++ (백준 28305번) (0) | 2024.08.19 |
[PS] 동전 쌍 뒤집기 / C++ (백준 32034번) (0) | 2024.08.16 |
[PS] 수 정렬하기, 근데 이제 제곱수를 곁들인 / C++ (백준 25323번) (0) | 2024.07.30 |