Open moodmine opened 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++
#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;
}
https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDYSqAAbw5UW6&subjectId=AV2dYG86Ac0BBASw