题目要求将同一天生日的学生学号输出。
总时间限制: 1000ms 内存限制: 65536kB
在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的学号,出生月日。试找出所有生日相同的学生。
第一行为整数n,表示有n个学生,n<100。
此后每行包含一个字符串和两个整数,分别表示学生的学号(字符串长度小于10)和出生月(1<=m<=12)日(1<=d<=31)。
学号、月、日之间用一个空格分隔。
对每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的学号,数字、学号之间都用一个空格分隔。
对所有的输出,要求按日期从前到后的顺序输出。
对生日相同的学号,按输入的顺序输出。
5
00508192 3 2
00508153 4 5
00508172 3 2
00508023 4 5
00509122 4 5
3 2 00508192 00508172
4 5 00508153 00508023 00509122
可以采用箱子排序的方式,毕竟月和日的全部组合较少,即使采用矩阵内存的开销也不大,但仍需3维数组来存放学号,所以对于超大规模问题不合适,应考虑动态数组。
最后对于存在两个以上相同生日的学生进行输出即可。
#include <iostream>
#include <string>
using namespace std;
int main() {
string stu[100], s;
int n, i, j, k, m, d, date[13][32][100] = { 0 };
cin >> n;
for (i = 0; i < n; ++i) {
cin >> s >> m >> d;
date[m][d][0]++;
date[m][d][date[m][d][0]] = i;
stu[i] = s;
}
for (i = 1; i < 13; ++i) {
for (j = 1; j < 32; ++j) {
if (date[i][j][0] > 1) {
cout << i << " " << j;
for (k = 0; k < date[i][j][0]; ++k) {
cout << " " << stu[date[i][j][k + 1]];
}
cout << endl;
}
}
}
return 0;
}
2724.cpp 代码长度:519B 内存:264kB 时间:2ms 通过率:82% 最小内存:136kB 最短时间:0ms
这里我用3维数组的第一个元素来存储相同生日的个数,方便后续处理,考虑大数据问题可以使用2维vector代替,最后按顺序遍历输出即可。
有任何的改进意见欢迎大家在微信平台公众号主页面留言或者发表issue。