您的位置:首页 > 其它

1028. 人口普查(20)

2014-12-29 20:38 344 查看

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 <string.h>typedef struct Birthday{char name[6];char day[11];}Birthday;Birthday data[100000];int main() {freopen("in", "r", stdin);int n;scanf("%d\n", &n);for (int i = 0; i < n; ++i)scanf("%s%s", data[i].name, data[i].day);int cnt = 0;		//合格人数int earlest = -1, latest = -1;		//出生最早和最迟的人的下标for (int i = 0; i < n; ++i)if(strcmp(data[i].day, "1814/09/06") >= 0 && strcmp(data[i].day, "2014/09/06") <= 0) {if(earlest < 0)				//找到第一个合格的人,是当前出生最早最晚的人earlest = latest = i;++cnt;if(strcmp(data[i].day, data[earlest].day) <= 0)earlest = i;else if(strcmp(data[i].day, data[latest].day) >= 0)latest = i;}if(cnt)printf("%d %s %s", cnt, data[earlest].name, data[latest].name);else		//没有合格的人输出0,不输出名字printf("%d", cnt);return 0;}
总结:[/code]
1.程序可以在线处理,不需要结构数组,写代码前没意识到;
2.在处理储存最老(earlest)和最年轻(latest)的人时采用记录下标的方法,这里有个容易导致错误的地方,earlest和latest不能赋值为0。因为第一个人可能不是合格的人,这个bug调试了两个小时才搞定!补救方法是找到第一个合格的人时给earlest和latest赋值。 当然,如果使用在线算法,直接保存完整数据不会出现这个问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: