您的位置:首页 > 其它

NOI3.1 6377:生日相同 2.0

2016-09-22 12:45 176 查看
描述

在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。

输入
第一行为整数n,表示有n个学生,n ≤ 180。此后每行包含一个字符串和两个整数,分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于20)和出生月(1 ≤ m ≤ 12)日(1 ≤ d ≤ 31)。名字、月、日之间用一个空格分隔
输出
每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。对所有的输出,要求按日期从前到后的顺序输出。 对生日相同的名字,按名字从短到长按序输出,长度相同的按字典序输出。如没有生日相同的学生,输出”None”
样例输入
6
Avril 3 2
Candy 4 5
Tim 3 2
Sufia 4 5
Lagrange 4 5
Bill 3 2


样例输出
3 2 Tim Bill Avril
4 5 Candy Sufia Lagrange


开始觉得这题只需要结构体排序,但要写两个结构体,有点烧脑,但这并不重要

这题主要实现介绍如何结构体套结构体,方法如下:

struct ill{
char name[21];
};
struct node{
int num;
ill ren[185];//用于访问“ill”结构体
}day[16][35];


不要笑结构体的名字…………

千万不要这样写:

struct node{

int num;

struct ill{

char name[20];

}ren[180];

};

不然在写排序函数时会报错

题目很简单,只是想介绍结构体的特性…………

AC代码如下:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct ill{
char name[21];
};
struct node{
int num;
ill ren[185];
}day[16][35];
bool fuu(ill x,ill y)
{
if(strlen(x.name)<strlen(y.name))
return 1;
if(strlen(x.name)==strlen(y.name)&&strcmp(x.name,y.name)<0)
return 1;
return 0;
}
int main()
{
int n,m,d,i,j,k;
bool p=0;
char a[21];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s%d%d",a,&m,&d);
strcpy(day[m][d].ren[day[m][d].num].name,a);
day[m][d].num++;
}
for(i=1;i<=12;i++)
for(j=1;j<=31;j++)
if(day[i][j].num)
sort(day[i][j].ren,day[i][j].ren+day[i][j].num,fuu);
for(i=1;i<=12;i++)
for(j=1;j<=31;j++)
if(day[i][j].num>1)
{
p=1;
printf("%d %d",i,j);
for(k=0;k<day[i][j].num;k++)
printf(" %s",day[i][j].ren[k].name);
printf("\n");
}
if(!p)
printf("None");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: