XOJ 2569:生日相同

在一個有180人的大班級中,存在兩個人生日相同的概率非常大,現給出每個學生的學號,出生月日。試找出所有生日相同的學生。


Input Data

第一行爲整數n,表示有n個學生,n<=180。
此後每行包含一個字符串和兩個整數,分別表示學生的姓名(字符串長度小於10且唯一)和出生月(1<=m<=12)日(1<=d<=31)。
學號、月、日之間用一個空格分隔。

Output Data

對每組生日相同的學生,輸出一行, 其中前兩個數字表示月和日,後面跟着所有在當天出生的學生的姓名,數字、學號之間都用一個空格分隔。
對所有的輸出,要求按日期從前到後的順序輸出。 對生日相同的人,按姓名從短到長輸出,長度相同的按字典序輸出。

若沒有相同的,輸出None


Input / Output Sample
7
Avril 3 2
Candy 4 5
Tim 3 2
Sufia 4 6
Lagrange 4 5
Bill 3 2
Aim 3 2
3 2 Aim Tim Bill Avril 
4 5 Candy Lagrange

代碼實現:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct student                //每個學生信息的結構體
{
    char name[20] = {0};
    int d = 0, m = 0, num = 0;
};
bool cmp(student a, student b)		//排序的依據函數,輸入的是結構體
{
    if(strlen(a.name)<strlen(b.name))
        return 1;
    else if(strlen(a.name) == strlen(b.name) && strcmp(a.name,b.name) < 0)
        return 1;
    return 0;
}
int main()
{
    struct student a[180];
    int n, flag = 0;
    scanf("%d",&n);
    getchar();
    for(int i = 0; i < n; i++)
    {
        scanf("%s",a[i].name);
        scanf("%d%d",&a[i].m,&a[i].d);
        getchar();
    }
    sort(a,a+n,cmp);	//使用sort算法函數進行排序,範圍是[a,a+n),左閉右開
    for(int i = 0; i < n-1; i++)
    {
        for(int j = i+1; j < n; j++)
        {
            if(a[i].d == a[j].d && a[i].m == a[j].m && a[i].num == 0)
            {
                printf("%d %d %s ",a[i].m,a[i].d,a[i].name);
                a[i].num = 1;
                flag = 1;
            }
            if(a[i].d == a[j].d && a[i].m == a[j].m && a[j].num == 0)
            {
                printf("%s ",a[j].name);
                a[j].num = 1;
                flag = 1;
            }
        }
        if(flag == 1)
        {
            printf("\n");
            flag = 0;
        }
    }
    flag = 0;
    for(int i = 0; i < n; i++)   //判斷有無輸出
    {
        if(a[i].num == 1)   flag = 1;
    }
    if(flag == 0)   printf("None");
    return 0;
}

鏈接www.xoj.red

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章