E번 혼자서는 못 풀었을 문제였음ㅋㅋㅋ
아이디어 쓰는 문제였는데 풀이가 진짜 신기하다.
이 문제는 점 A에서 B로 갈 때 몇 개의 직선을 건너냐는 문제다.
나는 이걸 막 교점을 구해서 그 교점과 A를 비교한 다음 하나씩 계산해야겠다고 생각했는데 더 쉽고 빠른 방법이 있었음.
직선을 건너는 경우를 생각해보면 어느 한 점은 직선 위에, 한 점은 직선 아래에 있어야 한다. 그래서 직선을 기준으로 점이 위, 아래에 있는지 계산한 다음 서로 다른 위치에 있는 경우 개수를 센다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
using namespace std;
using i64 = long long;
int main() {
vector<int> home(2);
vector<int> univ(2);
scanf("%d %d", &home[0], &home[1]);
scanf("%d %d", &univ[0], &univ[1]);
int n, count = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
i64 a, b, c;
scanf("%lld %lld %lld", &a, &b, &c);
i64 res1 = a*home[0] + b*home[1] + c;
i64 res2 = a*univ[0] + b*univ[1] + c;
if (res1 < 0ll && 0ll < res2)
count++;
else if (res2 < 0ll && 0ll < res1)
count++;
}
printf("%d", count);
return 0;
}
와... 아이디어가 다했다.
근데 두 번이나 틀렸다ㅋㅋㅋ
두 위치가 같은 곳에 있는지 다른 곳에 있는지 파악하려면 식에 점 위치를 넣어서 부호가 같아야 한다.
나름 깔쌈하게 하려고 두 수를 곱해서 양수라면 패스, 음수라면 count 하려 했는데 오버플로우 나서.. 틀렸음.
그래서 그냥 따로 비교했다.
예헤이~
'코드포스' 카테고리의 다른 글
[코드포스 Practice16] E. Squares and not squares (0) | 2020.04.05 |
---|---|
[코드포스 Practice16] D. Yet Another Walking Robot (0) | 2020.04.05 |
[코드포스 Practice16] C. Strongly Connected City (0) | 2020.03.27 |
[코드포스 Practice16] B. Blocks (0) | 2020.03.27 |
[코드포스 Practice16] A. Tanya and Toys (0) | 2020.03.27 |