Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
1.7 kB
2
Indexable
import java.util.Scanner;

public class MagneticBalance {
    static final double EPSILON = 1e-10;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        for (int test_case = 1; test_case <= T; test_case++) {
            int N = scanner.nextInt();
            double[] x = new double[N];
            double[] mass = new double[N];
            double totalMass = 0;

            for (int i = 0; i < N; i++) {
                x[i] = scanner.nextDouble();
                mass[i] = scanner.nextDouble();
                totalMass += mass[i];
            }

            double left = 0.0;
            double right = x[N - 1];
            double result = 0.0;

            while (right - left > EPSILON) {
                double mid = (left + right) / 2;
                double leftForce = calculateForce(x, mass, totalMass, mid, true);
                double rightForce = calculateForce(x, mass, totalMass, mid, false);

                if (leftForce < rightForce) {
                    left = mid;
                } else {
                    right = mid;
                }
                result = mid;
            }

            System.out.printf("#%d %.10f%n", test_case, result);
        }
    }

    static double calculateForce(double[] x, double[] mass, double totalMass, double mid, boolean isLeft) {
        double force = 0;
        for (int i = 0; i < x.length; i++) {
            double dist = isLeft ? (mid - x[i]) : (x[i] - mid);
            if (dist < 0) {
                force += mass[i] * totalMass / (dist * dist);
            }
        }
        return force;
    }
}