您的位置:首页 > 编程语言 > C语言/C++

PAT 乙级 1028. 人口普查(20)

2017-07-24 19:56 429 查看


1028.人口普查(20)

时间限制

200ms

内存限制

65536kB

代码长度限制

8000B

判题程序

Standard

作者

CHEN,Yue

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:

输入在第一行给出正整数N,取值在(0,105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。

输出格式:

在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:
5
John2001/05/12
Tom1814/09/06
Ann2121/01/30
James1814/09/05
Steve1967/11/20

输出样例:
3TomJohn


编译器

AWK(awk4.1.1)C(gcc4.7.2)
C#(mcs3.2.8.0)C++(g++4.7.2)
CommonLisp(sbcl1.2.4)Go(gcc
4000
go4.7.2)
Go(go1.3.3)Haskell(ghc7.6.3)
Java(javac1.6.0)Javascript(node0.10.33)
Lua(lua5.2.3)OCaml(ocamlc4.01.0)
Pascal(fpc2.6.4)Perl(perl5.20.2)
Plaintext(cat1.0)Python(python33.4.2)
Python(python22.7.9)Ruby(ruby2.1.5)
Scheme(racket6.1)Shell(bash4.3.30)
VisualBasic(vbnc0.0.0.5943)

 使用高级编辑器
代码



 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58




#include<cstdio>

#include<algorithm>

#include<cstring>

usingnamespacestd;

structpeople

{

charname[8];

inttd;

}p[100001];

inta[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

intcal_month(intq,intd)//计算从01.01日到q月d日是多少天

{

inti;

intans=0;

for(i=1;i<q;i++)

ans+=a[i];

ans+=d;

returnans;

}


intcmp(peopleA,peopleB){

returnA.td>B.td;

}

intday_diff(intyear_start,intmonth_start,intday_start,intyear_end,intmonth_end,intday_end)//计算从某年某月某日到某年某月某日的天数

{

inty2,d2,y1,d1;

intcount1=0;

inty=year_start;

count1=y/4-y/100+y/400;//从公元元年到y年的因为闰年多出的天数

y1=365*y+count1;

d1=cal_month(month_start,day_start)+y1;//总天数

intyy=year_end;

count1=yy/4-yy/100+yy/400;

y2=365*yy+count1;

d2=cal_month(month_end,day_end)+y2;


return(d2-d1);//相差的天数

}

intmain(){

intn,count=0,y,m,d;

charname[8];

scanf("%d",&n);

intlimt=day_diff(1814,9,6,2014,9,6);//两百年的天数

for(inti=0;i<n;i++){

scanf("%s%d/%d/%d",name,&y,&m,&d);

intt=day_diff(y,m,d,2014,9,6);//计算相差的天数

if(t>=0&&t<=limt){//满足条件

strcpy(p[count].name,name);

p[count++].td=t;

}

}

sort(p,p+count,cmp);//排序

if(count==0)printf("0");

else

printf("%d%s%s",count,p[0].name,p[count-1].name);

return0;

}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言