一、题目描述:
在一段时间内,到达港口的船有n艘,其中每艘船的信息包括:到达时间t(表示第t秒),船上乘客数k,以及k名乘客的国籍。输出前3600s内每艘船上国籍种数,并输出国籍种数最少的船只的到达时间。
二、分析:
首先,我们需要一个数据结构来存储每艘船的信息。我们可以使用结构体来表示每艘船,其中包含到达时间和乘客数组。乘客数组可以使用一个整型数组来表示,每个元素表示一名乘客的国籍。
三、代码:
#include <stdio.h>
#define MAX_SHIPS 1000
#define MAX_PASSENGERS 100
typedef 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
,该如何处理? - 如果用户输入的到达时间不按照升序排列,该如何处理?
- 如何判断两艘船只到达时间相同的情况下哪艘船只的国籍种数更少?