生日相同

题目链接:http://ica.openjudge.cn/struct/1/

总时间限制: 1000ms 内存限制: 65536kB
描述

在一个有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
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 struct stu
 5 {
 6     int month,day;//月,日
 7     char name[25];
 8 };
 9 struct obj
10 {
11     int month,day,count;//该日期生日的人数是count
12 };
13 int cmp(const void *a,const void *b)//需要交换的返回1,否则返回-1或0
14 {
15     struct stu x,y;
16     int len1,len2;
17     x=*((struct stu *)a);
18     y=*((struct stu *)b);
19     if(x.month>y.month)return 1;//需要交换
20     else if(x.month<y.month) return 0;//不需要交换
21     else if(x.day>y.day)return 1;
22     else if(x.day<y.day) return 0;
23     else
24     {
25         len1=strlen(x.name);
26         len2=strlen(y.name);
27         if(len1>len2)return 1;
28         else if(len1<len2)return 0;
29         else return strcmp(x.name,y.name);//长度相等,按字典序升序排序。返回正数表示要交换,返回0或负数不交换
30     }
31 }
32 int main(int argc, char *argv[])
33 {
34     int n,i,j,k,t;
35     struct stu a[200];
36     struct obj b[200];
37     freopen("data.in","r",stdin);
38
39     scanf("%d",&n);
40     for(i=0;i<n;i++)
41     {
42         scanf("%s%d%d",&a[i].name,&a[i].month,&a[i].day);
43     }
44
45     qsort(a,n,sizeof(struct stu),cmp);
46     //for(i=0;i<n;i++)
47         //printf("%d %d %s\n",a[i].month,a[i].day,a[i].name);
48
49     b[0].month=a[0].month;
50     b[0].day=a[0].day;
51     b[0].count=1;
52     j=0;
53     for(i=1;i<n;i++)
54     {
55         if(a[i].month==b[j].month&&a[i].day==b[j].day) b[j].count++;
56         else
57         {
58             j++;
59             b[j].month=a[i].month;
60             b[j].day=a[i].day;
61             b[j].count=1;
62         }
63     }
64
65     if(j==(n-1)) printf("None\n");
66     else
67     {
68         k=0;
69         for(i=0;i<=j;i++)
70         {
71             if(b[i].count>1)
72             {
73                 printf("%d %d",b[i].month,b[i].day);
74                 for(t=0;t<b[i].count;t++)
75                 {
76                     printf(" %s",a[k].name);
77                     k++;
78                 }
79                 printf("\n");
80             }
81             else k++;
82         }
83     }
84     return 0;
85 }
时间: 2024-10-29 13:31:18

生日相同的相关文章

NYOJ-20岁生日

20岁生日 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 路过这的20岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达20岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达20岁生日所经过的总天数,让他好来比较一下. 输入 一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD.如我的生日是1988-03-07. 输出 T行,每行一个数,表示此人从出生到20岁生日所经过的

SqlSever基础 datediff 计算人的生日是不准确的,示例

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 code 1 --查看现在的时间,方便对比 2 select getdate() 3 select datediff(year,'1996-11-01',getdate()) 4 select datediff(year,'1996-11-03',getdate()) 5 --还没过生日呢,怎

生日报警脚本

脚本作业:生日前三天报警脚本 总结; 刚拿到脚本要求,就想到利用date +%J命令来完成,用生日的全年天数与当日的全年天数作对比,判断生日是否过期,比较两者的差值是否等于3天,来进行前三天报警功能,报警语句进行颜色显示.一个简陋的小脚本,结合今天所学知识,秀下成就感.

bzoj1037[ZJOI2008]生日聚会

bzoj1037[ZJOI2008]生日聚会 题意: 一排小孩坐着玩游戏.就座的方案满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k.给出男孩数,女孩数和k,求就座方案数除以12345678的余数. 题解: dp方程见程序,i1i2表示当前选了几男几女,i3i4分别表示当前男比女多几个和女比男多几个. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define

练习:C#---类(身份证号截取生日、验证邮箱、DateTime)

//练习1:截取生日 Console.Write("请输入你的身份证号码:"); string id = Console.ReadLine(); Console.WriteLine("你的生日是:" + id.Substring(6, 4) + "年" + id.Substring(10, 2) + "月" + id.Substring(12, 2) + "日"); Console.ReadLine();

js 联动实现日期选择,一般用作生日

实现目标:年月日三个select 输入框,以及一个hidden的input,通过js获取input的值,如果有值切是日期格式,年月日select为input中的时间.否则为空.年默认区间段为1900年到当今年份 本人使用了bootstrap,class请参照bootstrap的相关说明 下面是html 内容: <div class="col-sm-9"> <label class="checkbox-inline"> <select n

2.生日蜡烛

题目内容: 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数.注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. //*****************************************************************************************************

课后作业 04 --DateTime应用,判断多久后生日之类

try { Console.Write("请以年-月-日的形式输入您的生日:"); string strA = Console.ReadLine(); DateTime bir = Convert.ToDateTime(strA); DateTime tod = DateTime.Today; strA = bir.ToString("MM-dd");//将输入生日转换为月 日格式 string strB = tod.ToString("MM-dd&quo

BZOJ 1037 生日聚会

Description 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k.很快,小朋友便找到了一种方案坐了下来开始游戏.hidadz的好朋友Susie发现,这样的就座方案其实是很多的,所以大家很快就找到了一种,那么到底有多少种呢?热爱数学的hidadz和她的朋友们开始思考这个问题…… 假设参加party的人中共有n个男孩与

有趣的概率算法--生日悖论

在算法导论书上看到个比较有意思的概率算法,在这里加上自己的理解分享下: 上次刚看同学发的朋友圈说道:“两个人同一间宿舍,而且同年同月同日生,这个缘分真的是醉了”,当时我也是醉醉的,看了这个算法后才发现,屋里有23个人,那么就可以50%的概率生日是一样的. 是这样子证明的: 首先,假设屋子里有K个人,分别对他们编号1,2,3….k号.不考虑闰年的情况,那么一年就有n=365天,首先还是要假设生日是均匀分布在一年的n天中(喜欢在春天生就都在春天生这就不均匀了),然后还要假设两个人生日相互独立(什么双