※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 14488번 문제인 준오는 급식충이야!!이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/14488
각 학생들이 시간 T가 지난 뒤에 있을 수 있는 범위를 폐구간으로 나타낼 때, 해당 폐구간들의 교집합이 공집합인지 아닌지 판별하는 것으로 문제를 해결할 수 있다.
부동소수점 연산을 이용한 문제 해결 방법은 오차로 틀릴 수 있음에 유의하자. 대신 10000을 곱한 정수값을 이용해 계산하여 부동소수점 오차를 피할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
typedef __int128 lll;
int NN, sidx; string s;
lll N, T;
lll X[50000], V[50000];
lll L, R;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> NN >> s;
N = NN;
while (sidx < s.length() && s[sidx] != '.') sidx++;
if (sidx == s.length()) s += '.';
while (sidx + 4 >= s.length()) s += '0';
T = stoll(s.substr(0, s.length() - 5)) * 10000 + stoll(s.substr(s.length() - 4, 4));
for (int i = 0; i < N; i++) {
int x; cin >> x;
X[i] = x;
}
for (int i = 0; i < N; i++) {
int v; cin >> v;
V[i] = v;
}
L = -1, R = 1;
for (int i = 0; i < 120; i++) L *= 2, R *= 2;
for (int i = 0; i < N; i++) {
lll lft = X[i] * 10000 - T * V[i];
lll rgt = X[i] * 10000 + T * V[i];
L = max(L, lft), R = min(R, rgt);
}
if (L <= R) cout << 1;
else cout << 0;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 15487 // C++] A[j]-A[i]+A[l]-A[k] (1) | 2024.09.09 |
---|---|
[BOJ 19686 // C++] Lost Array (0) | 2024.09.08 |
[BOJ 6199 // C++] Big Square (2) | 2024.09.06 |
[BOJ 7088 // C++] Word counting (1) | 2024.09.05 |
[BOJ 7804 // C++] Taxi! (3) | 2024.09.04 |