2 WA...
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -8,3 +8,4 @@
|
|||||||
*.dat
|
*.dat
|
||||||
*.ilk
|
*.ilk
|
||||||
*.pdb
|
*.pdb
|
||||||
|
*.in
|
||||||
@@ -44,7 +44,7 @@ int main() {
|
|||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
scanf("%lf %lf", &read_x, &read_y);
|
scanf("%lf %lf", &read_x, &read_y);
|
||||||
for (int j = 0; j < valid_point_num; j++) {
|
for (int j = 0; j < valid_point_num; j++) {
|
||||||
if (compare_double(read_x, point_xs[valid_point_num])) {
|
if (compare_double(read_x, point_xs[j])) {
|
||||||
found_duplicate = true;
|
found_duplicate = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -70,11 +70,11 @@ int main() {
|
|||||||
for (int i = 0; i < row; i++) {
|
for (int i = 0; i < row; i++) {
|
||||||
t[row] -= t[i] * get_num(row, i);
|
t[row] -= t[i] * get_num(row, i);
|
||||||
}
|
}
|
||||||
if (!compare_double(t[row], 0)) {
|
if (compare_double(t[row] / 1000, 0)) {
|
||||||
t[row] /= get_num(row, row);
|
t[row] = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
t[row] = 0;
|
t[row] /= get_num(row, row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
124
2023208/vandermonde.cpp
Normal file
124
2023208/vandermonde.cpp
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#define EPSILON 1e-6
|
||||||
|
struct Point {
|
||||||
|
double x, y;
|
||||||
|
};
|
||||||
|
|
||||||
|
double A[101][101] = {0};
|
||||||
|
Point points[101] = {0};
|
||||||
|
int valid_point_num = 0;
|
||||||
|
int n = 0, m = 0;
|
||||||
|
|
||||||
|
int display_matrix() {
|
||||||
|
for (int i = 0; i < valid_point_num; i++) {
|
||||||
|
for (int j = 0; j < valid_point_num; j++) {
|
||||||
|
printf("%lf ", A[i][j]);
|
||||||
|
}
|
||||||
|
printf("| %lf\n", points[i].y);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int display_result_vec() {
|
||||||
|
for (int i = 0; i < valid_point_num; i++) {
|
||||||
|
printf("%lf ", points[i].x);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool compare_double(double a, double b) {
|
||||||
|
return (a - b > 0 ? a - b : -(a - b)) < EPSILON;
|
||||||
|
}
|
||||||
|
|
||||||
|
double evaluate(double x, int highest) {
|
||||||
|
double ans = points[highest].x;
|
||||||
|
for (int i = highest + 1; i < valid_point_num; i++) {
|
||||||
|
ans *= x;
|
||||||
|
ans += points[i].x;
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
// freopen("lambdaeight19.in", "r", stdin);
|
||||||
|
scanf("%d %d", &n, &m);
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
bool found_duplicate = false;
|
||||||
|
double read_x, read_y;
|
||||||
|
scanf("%lf %lf", &read_x, &read_y);
|
||||||
|
for (int j = 0; j < valid_point_num; j++) {
|
||||||
|
if (compare_double(read_x, points[j].x)) {
|
||||||
|
found_duplicate = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found_duplicate) {
|
||||||
|
points[valid_point_num++] = Point {read_x, read_y};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// vandermonde matrix
|
||||||
|
for (int i = 0; i < valid_point_num; i++) {
|
||||||
|
A[i][n - 1] = 1;
|
||||||
|
for (int j = valid_point_num - 2; j >= 0; j--) {
|
||||||
|
A[i][j] = points[i].x * A[i][j + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// display_matrix();
|
||||||
|
|
||||||
|
// Gauss
|
||||||
|
for (int col = 0; col < valid_point_num; col++) {
|
||||||
|
for (int row = col + 1; row < valid_point_num; row++) {
|
||||||
|
if (compare_double(A[col][col], 0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
double coeff = - A[row][col] / A[col][col];
|
||||||
|
A[row][col] = 0;
|
||||||
|
for (int i = col + 1; i < valid_point_num; i++) {
|
||||||
|
A[row][i] += coeff * A[col][i];
|
||||||
|
}
|
||||||
|
points[row].y += coeff * points[col].y;
|
||||||
|
}
|
||||||
|
display_matrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Solve for x
|
||||||
|
for (int i = valid_point_num - 1; i >= 0; i--) {
|
||||||
|
for (int j = valid_point_num - 1; j > i; j--) {
|
||||||
|
points[i].y -= points[j].x * A[i][j];
|
||||||
|
}
|
||||||
|
if (compare_double(points[i].y, 0)) {
|
||||||
|
points[i].x = 0;
|
||||||
|
} else {
|
||||||
|
points[i].x = points[i].y / A[i][i];
|
||||||
|
}
|
||||||
|
// display_result_vec();
|
||||||
|
}
|
||||||
|
|
||||||
|
display_result_vec();
|
||||||
|
|
||||||
|
// Find highest
|
||||||
|
int highest = 0;
|
||||||
|
for (int i = 0; i < valid_point_num; i++) {
|
||||||
|
if (!compare_double(points[i].x, 0)) {
|
||||||
|
highest = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%d\n", valid_point_num - 1 - highest);
|
||||||
|
|
||||||
|
//Evaluate
|
||||||
|
for (int i = 0; i < m; i++) {
|
||||||
|
double to_be_evaled = 0;
|
||||||
|
scanf("%lf", &to_be_evaled);
|
||||||
|
printf("%lf\n", evaluate(to_be_evaled, highest));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user