Bailian3238 生日相同【稳定排序】

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;
}

猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/108555891
今日推荐