murry2018 / BelarusianCutlet

[벨라루스 전통 돈까스집] 알고리즘 스터디용 리포지토리입니다.
0 stars 0 forks source link

21W28-구현 - 02 완전검색 #12

Open moodmine opened 3 years ago

moodmine commented 3 years ago

https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDYSqAAbw5UW6&subjectId=AV2dYG86Ac0BBASw

happy-oh commented 3 years ago

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<iostream>
#include<string.h>

using namespace std;

int main(void)
{

   // freopen("input.txt", "r", stdin);
    int T, test_case;
    double div_10[11] = { 1, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, 0.00000001, 0.000000001, 0.0000000001 };
    scanf("%d", &T);
    int flag_0, N;
    double x, answer;
    int dis_arr[10];
    int mea_arr[10];
    int idx, jdx, kdx, mdx, ndx;

    for (test_case = 1; test_case <= T; ++test_case)
    {
        scanf("%d", &N);
        for (idx = 1; idx <= N; ++idx)
        {
            scanf("%d ", &dis_arr[idx-1]);
        }
        for (idx = 1; idx <= N; ++idx)
        {
            scanf("%d ", &mea_arr[idx - 1]);
        }
        printf("#%d ", test_case);

        for (idx = 1; idx <= N - 1; ++idx)
        {
            answer = 0;
            int idx_numbers[11] = { 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            flag_0 = 0;
            int num_1st;
            double sum_result, sum_temp;
            num_1st = (dis_arr[idx] - dis_arr[idx - 1]) * 10 - 1;
            for (jdx = 1; jdx <= num_1st; ++jdx)/// test 1st situaation. 0.1 level test -> distance / 0.1 - 1 
            {
                sum_temp = 0;
                x = (double)dis_arr[idx - 1] + 0.1 * (double)jdx;
                for (kdx = 0; kdx < N; ++kdx)
                {
                    if (dis_arr[kdx] < x)
                        sum_temp = sum_temp - mea_arr[kdx] / ((dis_arr[kdx] - x) * (dis_arr[kdx]- x));
                    else
                        sum_temp = sum_temp + mea_arr[kdx] / ((dis_arr[kdx] - x) * (dis_arr[kdx]-x));
                }
                double temp;
                temp = sum_temp;
                if (sum_temp == 0)
                {
                    flag_0 = 1;
                    answer = x;
                }
                else if (sum_temp < 0)
                    sum_temp = -sum_temp;

                if (jdx == 1)
                {
                    sum_result = sum_temp;
                    idx_numbers[1] = jdx;
                }
                else if (sum_result > sum_temp)
                {
                    sum_result = sum_temp;
                    idx_numbers[1] = jdx;
                }
            }
            /////////////////////////second ~ 10th test. just 19
            for (jdx = 2; jdx <= 10; ++jdx)
            {
                if (flag_0 == 1)
                    break;
                double x_temp;
                x_temp = (double)dis_arr[idx - 1]  + div_10[1] * (double)idx_numbers[1] + div_10[2] * (double)idx_numbers[2] + div_10[3] * (double)idx_numbers[3] + div_10[4] * (double)idx_numbers[4] + div_10[5] * (double)idx_numbers[5] + div_10[6] * (double)idx_numbers[6] + div_10[7] * (double)idx_numbers[7] + div_10[8] * (double)idx_numbers[8] + div_10[9] * (double)idx_numbers[9] + div_10[10] * (double)idx_numbers[10];
                for (kdx = -9; kdx <= 9; ++kdx)
                {
                    if (flag_0 == 1)
                        break;
                    sum_temp = 0;
                    x = x_temp + div_10[jdx] * (double)kdx;

                    for (mdx = 0; mdx < N; ++mdx)
                    {
                        if (dis_arr[mdx] < x)
                            sum_temp = sum_temp - mea_arr[mdx] / ((dis_arr[mdx] - x) * (dis_arr[mdx] - x));
                        else
                            sum_temp = sum_temp + mea_arr[mdx] / ((dis_arr[mdx] - x) * (dis_arr[mdx] - x));
                    }

                    if (sum_temp == 0)
                    {
                        flag_0 = 1;
                        answer = x;
                        break;
                    }
                    else if (sum_temp < 0)
                        sum_temp = -sum_temp;

                    if (kdx == -9)
                    {
                        sum_result = sum_temp;
                        idx_numbers[jdx] = kdx;
                        if (jdx == 10)
                            answer = x;
                    }
                    else if (sum_result > sum_temp)
                    {
                        sum_result = sum_temp;
                        idx_numbers[jdx] = kdx;
                        if (jdx == 10)
                            answer = x;
                    }
                }
            }

            printf("%.10lf ", answer);

        }
        printf("\n");

        /*
        printf("\n# %d :", test_case);
        for (idx = 1; idx <= N; ++idx)
        {
            printf("%d ", dis_arr[idx - 1]);
        }
        for (idx = 1; idx <= N; ++idx)
        {
            printf("%d ", mea_arr[idx - 1]);
        }

        */

    }
    return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
```c++
moodmine commented 3 years ago

SWEA 1245. 균형점

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

double MagFormula(double point, double location_mag, double mass_mag)
{
    // point와 mag의 값이 같을 경우 분자가 0이 되는 오류가 됨으로 제외

    if (point > location_mag) // 자성체가 물체보다 왼쪽에 있을 때에는 음수로 표기
        return -mass_mag / ((point - location_mag) * (point - location_mag));
    else // 자성체가 물체보다 오른쪽에 있을 때에는 양수로 표기
        return mass_mag / ((point - location_mag) * (point - location_mag));
}

int main(int argc, char** argv)
{
    int test_case;
    int T;
    freopen("input.txt", "r", stdin);
    scanf("%d", &T);

    for (test_case = 1; test_case <= T; ++test_case)
    {
        int i, j;
        int num_mag = 0; // 자성체의 갯수
        scanf("%d", &num_mag);
        double** mag;
        mag = (double**)malloc(sizeof(double) * num_mag); // 배열의 행은 자성체의 인덱스를 의미
        for (i = 0; i < num_mag; i++)
            mag[i] = (double*)malloc(sizeof(double) * 2); // 0번 열은 자성체의 위치, 1번 열은 자성체의 질량을 저장

        for (i = 0; i < num_mag; i++)
            scanf("%lf", &mag[i][0]);
        for (i = 0; i < num_mag; i++)
            scanf("%lf", &mag[i][1]);

        double point = ((mag[0][0]) + (mag[num_mag - 1][0])) / 2;
        double point_pre = -1;
        double right_barrier = mag[num_mag - 1][0];
        double left_barrier = mag[0][0];
        double sum = 0;

        printf("#%d", test_case);

        for (j = 0; j < num_mag - 1; j++)
        {
            point = ((mag[j][0]) + (mag[j + 1][0])) / 2;
            left_barrier = mag[j][0];
            right_barrier = mag[j + 1][0];

            printf(" ");
            while (1)
            {
                sum = 0;

                for (i = 0; i < num_mag; i++)
                {
                    sum += MagFormula(point, mag[i][0], mag[i][1]);
                }

                if ((sum < 1e-13 && sum > -1e-13) || (point - point_pre < 1e-13 &&point - point_pre > -1e-13))
                {
                    break;
                }
                else
                {
                    if (sum > 0) // 포인트를 기준으로 오른쪽에 있는 자성체가 더 강한 경우 -> 포인트가 왼쪽으로 이동해야함.
                    {
                        point_pre = point;
                        right_barrier = point;
                        point = (left_barrier + point) / 2;
                    }
                    else // 포인트를 기준으로 왼쪽에 있는 자성체가 더 강한 경우 -> 포인트가 오른쪽으로 이동해야함.
                    {
                        point_pre = point;
                        left_barrier = point;
                        point = (point + right_barrier) / 2;
                    }
                }
            }
            printf("%.10lf", point);
        }

        printf("\n");
    }
    return 0;
}