1028. 人口普查(20)
时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出格式:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:5 John 2001/05/12 Tom 1814/09/06 Ann 2121/01/30 James 1814/09/05 Steve 1967/11/20输出样例:
3 Tom John
#include<stdio.h> #include<stdlib.h> struct PersonNode { char name[6]; int year; int month; int day; int err_flag; }person[100001]; int main() { int N,min=-1,max=-1; int i,err_count=0,err_flag=0; scanf("%d",&N); for ( i= 0; i < N; i++) { scanf("%s %d/%d/%d",&person[i].name,&person[i].year,&person[i].month,&person[i].day); person[i].err_flag=0; /*check */ if(person[i].year<=1814) { if(person[i].year<1814) {person[i].err_flag=1;err_count++;} else { if(person[i].month<=9) { if(person[i].month<9) {person[i].err_flag=1;err_count++;} else { if(person[i].day<=6) { if(person[i].day<6) {person[i].err_flag=1;err_count++;} } } } } } /*check */ else if(person[i].year>=2014) { if(person[i].year>2014) {person[i].err_flag=1;err_count++;} else { if(person[i].month>=9) { if(person[i].month>9) {person[i].err_flag=1;err_count++;} else { if(person[i].day>=6) { if(person[i].day>6) {person[i].err_flag=1;err_count++;} } } } } } if(person[i].err_flag==0) min=max=i; } for ( i= 0; i < N; i++) { /*find max*/ if(person[i].err_flag) break; if(person[i].year>=person[max].year) { if(person[i].year>person[max].year) max=i; else { if(person[i].month>=person[max].month) { if(person[i].month>person[max].month) max=i; else { if(person[i].day>=person[max].day) { if(person[i].day>person[max].day) max=i; } } } } } /*find min*/ if(person[i].year<=person[min].year) { if(person[i].year<person[min].year) min=i; else { if(person[i].month<=person[min].month) { if(person[i].month<person[min].month) min=i; else { if(person[i].day<=person[min].day) { if(person[i].day<person[min].day) min=i; } } } } } } printf("%d %s %s ",N-err_count,person[min].name,person[max].name ); }
第一个版本没有完全通过, 而且特别占内存。
这是一个查找问题,我们要做的是计数,跟找出名字, 所以没有必要
把所有的信息存起来。输入一个判读一个即可。
如果是最小或者最大,只需要记录下名字。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int BirthdayCmp(int person1year,int person1month,int person1day ,int person2year,int person2month,int person2day ); 6 int IsLeagl(int year,int month,int day); 7 int main() 8 { 9 int N; 10 int i,err_count=0,check=0; 11 char names[6],max_names[6]=" ",min_names[6]=" "; 12 int year,month,day; 13 int max_year=2014,max_month=9,max_day=06; 14 int min_year=1814,min_month=9,min_day=06; 15 scanf("%d",&N); 16 for ( i= 0; i < N; i++) 17 { 18 scanf("%s %d/%d/%d",names,&year,&month,&day); 19 /*check */ 20 if( IsLeagl( year,month,day)) 21 { 22 check++; 23 if(BirthdayCmp(year,month,day,max_year,max_month,max_day)==1) 24 { 25 max_year=year;max_month=month;max_day=day; 26 strcpy(max_names,names); 27 } 28 if(BirthdayCmp(year,month,day,min_year,min_month,min_day)==-1) 29 { 30 min_year=year;min_month=month;min_day=day; 31 strcpy(min_names,names); 32 } 33 } 34 35 } 36 37 38 if(check) printf("%d %s %s ",check,max_names,min_names ); 39 else printf("0"); 40 } 41 int IsLeagl(int year,int month,int day) 42 { 43 if(year<1814||(year==1814&&month<9)||(year==1814&&month==9&&day<6)) return 0; 44 else if(year>2014||(year==2014&&month>9)||(year==2014&&month==9&&day>6)) return 0; 45 else return 1; 46 } 47 int BirthdayCmp(int person1year,int person1month,int person1day ,int person2year,int person2month,int person2day ) 48 { 49 if(person1year<person2year||(person1year==person2year&&person1month<person2month)||(person1year==person2year&&person1month==person2month&&person1day<=person2day)) return 1; 50 else if(person1year>person2year||(person1year==person2year&&person1month>person2month)||(person1year==person2year&&person1month==person2month&&person1day>=person2day)) return -1; 51 else return 0; 52 }