※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts