分组均衡性
在上机实验课上,老师将所有学生排列为 n 排,每排坐 m 个学生。每个学生有左右两个邻座(除了这一排的左右两端)。每个人可以和自己的邻座互相帮助完成实验。除了每排左右两端的学生,中间的每个学生都可以同时与两个邻座分别协作。
由于每个学生的个人能力不同,假设协作产生的小组能力值是两个协作学生的能力值之和,老师希望知道,自己给出的座位安排在多大程度上是“均衡”的 —— 所谓分组均衡性,是指所有可能组成的协作小组的能力值的最大值与最小值之差。
给定一张座位安排表,请计算这个安排的分组均衡性。
时间限制:1000
内存限制:65536
输入
输入第一行给出 2 个正整数 n 和 m(2 ≤ n, m ≤ 100),依次为座位的排数和每排的人数。 随后 n 行,每行给出 m 个数字,代表对应座位上学生的能力值(为区间 [1, 100] 内的整数)。同行数字间以空格分隔。
输出
在一行中输出分组均衡性。
样例输入
3 5
10 80 30 95 60
79 55 63 84 41
98 23 72 85 58
样例输出
67
提示
样例解释:最强组合是第 3 排的 72+85=157;最弱组合是第 1 排的 10+80=90。因此两者之差为 67。
#include
#include
// 函数用于读取座位表信息
void read_seating_arrangement(int **seating, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &seating[i][j]) != 1) {
fprintf(stderr, "输入错误,期望输入整数。\n");
exit(EXIT_FAILURE);
}
}
}
}
// 函数用于计算分组均衡性
int calculate_grouping_balance(int **seating, int rows, int cols) {
int max_group = 0;
int min_group = 200;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols - 1; j++) {
int current_group = seating[i][j] + seating[i][j + 1];
if (current_group > max_group) {
max_group = current_group;
}
if (current_group < min_group) {
min_group = current_group;
}
}
}
return max_group - min_group;
}
int main() {
int rows, cols;
if (scanf("%d %d", &rows, &cols) != 2) {
fprintf(stderr, "输入错误,期望输入两个整数。\n");
return EXIT_FAILURE;
}
// 动态分配二维数组存储座位表
int **seating = (int **)malloc(rows * sizeof(int *));
if (seating == NULL) {
fprintf(stderr, "内存分配失败。\n");
return EXIT_FAILURE;
}
for (int i = 0; i < rows; i++) {
seating[i] = (int *)malloc(cols * sizeof(int));
if (seating[i] == NULL) {
fprintf(stderr, "内存分配失败。\n");
for (int j = 0; j < i; j++) {
free(seating[j]);
}
free(seating);
return EXIT_FAILURE;
}
}
// 读取座位表信息
read_seating_arrangement(seating, rows, cols);
// 计算分组均衡性
int balance = calculate_grouping_balance(seating, rows, cols);
printf("%d\n", balance);
// 释放动态分配的内存
for (int i = 0; i < rows; i++) {
free(seating[i]);
}
free(seating);
return 0;
}