在一個有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