PS

BOJ 13312 : 아크코사인은 믿음입니다

lickelon 2024. 6. 15. 22:33
  • 문제 링크 : boj.kr/13312
  • 난이도 : G4
  • 태그 : 해 구성하기

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

float _abs(float x){ return x < 0? -x : x; }
bool is_equal(double a, double b){ return _abs(a-b) < 1e-3; }

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n = 3;
    int arr[3];
    random_device rd;
    mt19937 mt(rd());
    uniform_int_distribution<int> dist(-100, 100);
    while(true) {
        arr[0] = dist(mt);
        arr[1] = dist(mt);
        if(arr[0] + arr[1] > 0) arr[2] = 100 - (arr[0] + arr[1]);
        else arr[2] = -100 - (arr[0] + arr[1]);
        double a = arr[0] + arr[1] + arr[2];
        a /= 100;
        double b = arr[0] / 100.0 + arr[1] / 100.0 + arr[2] / 100.0;

        if(!is_equal(acos(a), acos(b))) {
            cout << arr[0] << " " << arr[1] << " " << arr[2] << "\n";
            cout << a << "\n" << b << "\n";
            break;
        }
    }


    return 0;
}

풀이

둘이 다를 조건은 acos의 경계값 -1 혹은 1에서 실수 오차가 발생하는 경우이다.

N=3에서도 충분히 실수 오차가 발생할 수 있다. 따라서 세 수의 합이 100 혹은 -100이 되도록 무작위로 값을 넣어보고, 이 값을 제공된 코드로 확인해보면 된다.

'PS' 카테고리의 다른 글

BOJ 1593 : 문자 해독  (0) 2024.06.17
BOJ 2138 : 전구와 스위치  (0) 2024.06.16
BOJ 31862 : 승리하라  (0) 2024.06.14
BOJ 17505 : 링고와 순열  (1) 2024.06.13
BOJ 18869 : 멀티버스 Ⅱ  (0) 2024.06.12