Submission
Status:
----------
Score: 0
User: Jokul
Problemset: สมดุลย์
Language: c
Time: 0.002 second
Submitted On: 2025-03-19 18:22:52
#include <stdio.h>
#define MAX_N 1000
#define MAX_WEIGHT 200
typedef struct {
int A, L, B, R; // A, L for left side; B, R for right side
} Stick;
Stick sticks[MAX_N];
double weights[MAX_N];
double added_weights[MAX_N];
double calculate_weights(int idx) {
double left_weight = 0;
double right_weight = 0;
// Left side
if (sticks[idx].A == 1) { // Left side is a weight
left_weight += sticks[idx].L;
} else { // Left side is another stick
left_weight += calculate_weights(sticks[idx].L - 1);
}
// Right side
if (sticks[idx].B == 1) { // Right side is a weight
right_weight += sticks[idx].R;
} else { // Right side is another stick
right_weight += calculate_weights(sticks[idx].R - 1);
}
// Store the total weight for the current stick
weights[idx] = left_weight + right_weight;
return weights[idx];
}
double balance_mob(int N) {
double total_added_weight = 0;
// Calculate weights for each stick
calculate_weights(0);
for (int i = 0; i < N; i++) {
double left_weight = 0;
double right_weight = 0;
if (sticks[i].A == 1) {
left_weight += sticks[i].L;
} else {
left_weight += weights[sticks[i].L - 1];
}
if (sticks[i].B == 1) {
right_weight += sticks[i].R;
} else {
right_weight += weights[sticks[i].R - 1];
}
if (left_weight > right_weight) {
added_weights[i] = left_weight - right_weight;
} else {
added_weights[i] = right_weight - left_weight;
}
total_added_weight += added_weights[i];
}
return total_added_weight;
}
int main() {
int N;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d %d %d %d", &sticks[i].A, &sticks[i].L, &sticks[i].B, &sticks[i].R);
}
double result = balance_mob(N);
printf("%.1f\n", result);
return 0;
}