Skip to content

Latest commit

 

History

History
80 lines (62 loc) · 2.37 KB

2724.md

File metadata and controls

80 lines (62 loc) · 2.37 KB

生日相同 2724: 生日相同

题目要求将同一天生日的学生学号输出。

题目来源

2724: 生日相同

总时间限制: 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。