一、题目描述:
在一段时间内,到达港口的船有n艘,其中每艘船的信息包括:到达时间t(表示第t秒),船上乘客数k,以及k名乘客的国籍。输出前3600s内每艘船上国籍种数,并输出国籍种数最少的船只的到达时间。
二、分析:
首先,我们需要一个数据结构来存储每艘船的信息。我们可以使用结构体来表示每艘船,其中包含到达时间和乘客数组。乘客数组可以使用一个整型数组来表示,每个元素表示一名乘客的国籍。
三、代码:
#include <stdio.h>#define MAX_SHIPS 1000
#define MAX_PASSENGERS 100typedef struct {int arrival_time;int passengers[MAX_PASSENGERS];int num_passengers;
} Ship;int main() {// 输入n艘船的信息int n;printf("请输入船只数量:");scanf("%d", &n);Ship ships[MAX_SHIPS];for (int i = 0; i < n; i++) {printf("请输入第%d艘船的到达时间:", i + 1);scanf("%d", &ships[i].arrival_time);printf("请输入第%d艘船上乘客数量:", i + 1);scanf("%d", &ships[i].num_passengers);printf("请输入第%d艘船上乘客的国籍(以空格分隔):", i + 1);for (int j = 0; j < ships[i].num_passengers; j++) {scanf("%d", &ships[i].passengers[j]);}}// 统计每艘船上的国籍种数int nationality_count[MAX_SHIPS] = {0};for (int i = 0; i < n; i++) {for (int j = 0; j < ships[i].num_passengers; j++) {nationality_count[i]++;}}// 找到国籍种数最少的船只的到达时间int min_nationality_count = nationality_count[0];int min_nationality_time = ships[0].arrival_time;for (int i = 1; i < n; i++) {if (nationality_count[i] < min_nationality_count) {min_nationality_count = nationality_count[i];min_nationality_time = ships[i].arrival_time;}}// 输出每艘船上的国籍种数for (int i = 0; i < n; i++) {printf("第%d艘船上的国籍种数为%d\n", i + 1, nationality_count[i]);}// 输出国籍种数最少的船只的到达时间printf("国籍种数最少的船只的到达时间为%d\n", min_nationality_time);return 0;
}
四、解释:
- 首先,我们定义了一个
Ship
结构体来表示每艘船的信息。该结构体包含了arrival_time
用于表示到达时间,passengers
数组用于存储乘客国籍,以及num_passengers
表示乘客数量。 - 接下来,我们在
main
函数中读取用户输入的船只数量和每艘船的信息。 - 然后,我们使用一个循环来统计每艘船上的国籍种数。遍历每艘船的乘客数组,每次遇到一个新的国籍,就将国籍种数加1。
- 接着,我们使用另一个循环来找到国籍种数最少的船只的到达时间。我们从第一艘船开始遍历,如果遇到一个国籍种数更少的船只,就更新最小的国籍种数和对应的到达时间。
- 最后,我们使用循环输出每艘船上的国籍种数,并输出国籍种数最少的船只的到达时间。
五、一些相关问题:
- 如果船只数量超过了预先定义的上限
MAX_SHIPS
,该如何处理? - 如何统计所有船只中的不同国籍种数?
- 如果乘客数量超过了预先定义的上限
MAX_PASSENGERS
,该如何处理? - 如果用户输入的到达时间不按照升序排列,该如何处理?
- 如何判断两艘船只到达时间相同的情况下哪艘船只的国籍种数更少?