编程题

分组均衡性

 

在上机实验课上,老师将所有学生排列为 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;

查看答案
赣ICP备20007335号-2