3238:生日相同
总时间限制: 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
问题链接:Bailian3238 生日相同
问题简述:(略)
问题分析:排序处理问题,需要用稳定排序来解决,也可以采取措施保证是稳定排序。由于没有相同生日的学号不输出,所以输出处理部分比较繁琐。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* Bailian3238 生日相同 */
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
struct Student {
char no[10 + 1];
int m, d;
} a[N];
bool cmp(Student a, Student b)
{
return a.m != b.m ? a.m < b.m : a.d < b.d;
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i].no >> a[i].m >> a[i].d;
stable_sort(a, a + n, cmp);
if(n > 1) {
bool bflag = true, fflag = true;
for(int i = 0; i < n - 1; i++)
if(a[i].m == a[i + 1].m && a[i].d == a[i + 1].d) {
if(bflag) {
if(fflag) {
cout << a[i].m << " " << a[i].d << " " << a[i].no;
fflag = false;
} else
cout << endl << a[i].m << " " << a[i].d << " " << a[i].no;
bflag = false;
}
cout << " " << a[i + 1].no;
} else
bflag = true;
}
return 0;
}