PAT乙级 1028. 人口普查(20)
1028. 人口普查(20)
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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[];
int year;
int month;
int day;
int err_flag; }person[];
int main()
{
int N,min=-,max=-;
int i,err_count=,err_flag=;
scanf("%d",&N);
for ( i= ; i < N; i++)
{
scanf("%s %d/%d/%d",&person[i].name,&person[i].year,&person[i].month,&person[i].day);
person[i].err_flag=;
/*check */
if(person[i].year<=)
{
if(person[i].year<) {person[i].err_flag=;err_count++;}
else
{
if(person[i].month<=)
{
if(person[i].month<) {person[i].err_flag=;err_count++;}
else
{
if(person[i].day<=)
{
if(person[i].day<) {person[i].err_flag=;err_count++;}
}
}
} }
}
/*check */
else
if(person[i].year>=)
{
if(person[i].year>) {person[i].err_flag=;err_count++;}
else
{
if(person[i].month>=)
{
if(person[i].month>) {person[i].err_flag=;err_count++;}
else
{
if(person[i].day>=)
{
if(person[i].day>) {person[i].err_flag=;err_count++;}
}
}
} }
}
if(person[i].err_flag==)
min=max=i; }
for ( i= ; 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",N-err_count,person[min].name,person[max].name );
}
第一个版本没有完全通过, 而且特别占内存。
这是一个查找问题,我们要做的是计数,跟找出名字, 所以没有必要
把所有的信息存起来。输入一个判读一个即可。
如果是最小或者最大,只需要记录下名字。
#include<stdio.h>
#include<stdlib.h>
#include<string.h> int BirthdayCmp(int person1year,int person1month,int person1day ,int person2year,int person2month,int person2day );
int IsLeagl(int year,int month,int day);
int main()
{
int N;
int i,err_count=,check=;
char names[],max_names[]=" ",min_names[]=" ";
int year,month,day;
int max_year=,max_month=,max_day=;
int min_year=,min_month=,min_day=;
scanf("%d",&N);
for ( i= ; i < N; i++)
{
scanf("%s %d/%d/%d",names,&year,&month,&day);
/*check */
if( IsLeagl( year,month,day))
{
check++;
if(BirthdayCmp(year,month,day,max_year,max_month,max_day)==)
{
max_year=year;max_month=month;max_day=day;
strcpy(max_names,names);
}
if(BirthdayCmp(year,month,day,min_year,min_month,min_day)==-)
{
min_year=year;min_month=month;min_day=day;
strcpy(min_names,names);
}
} } if(check) printf("%d %s %s\n",check,max_names,min_names );
else printf("");
}
int IsLeagl(int year,int month,int day)
{
if(year<||(year==&&month<)||(year==&&month==&&day<)) return ;
else if(year>||(year==&&month>)||(year==&&month==&&day>)) return ;
else return ;
}
int BirthdayCmp(int person1year,int person1month,int person1day ,int person2year,int person2month,int person2day )
{
if(person1year<person2year||(person1year==person2year&&person1month<person2month)||(person1year==person2year&&person1month==person2month&&person1day<=person2day)) return ;
else if(person1year>person2year||(person1year==person2year&&person1month>person2month)||(person1year==person2year&&person1month==person2month&&person1day>=person2day)) return -;
else return ;
}
PAT乙级 1028. 人口普查(20)的更多相关文章
- PAT Basic 1028 人口普查 (20 分)
某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...
- PAT (Basic Level) Practise (中文)-1028. 人口普查(20)
PAT (Basic Level) Practise (中文)-1028. 人口普查(20) http://www.patest.cn/contests/pat-b-practise/1028 某 ...
- PAT 1028 人口普查(20)(STL-set+思路+测试点分析)
1028 人口普查(20)(20 分) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超 ...
- PAT-乙级-1028. 人口普查(20)
1028. 人口普查(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 某城镇进行人口普查,得到了全体居民的 ...
- PATB 1028. 人口普查(20)
1028. 人口普查(20) 注意特判合理人数为0,否则格式错误.很暴力的sort排序找出最大最小. 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Stan ...
- PAT(B) 1028 人口普查(C)字符串
题目链接:1028 人口普查 (20 point(s)) 题目描述 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是 ...
- PAT 1028. 人口普查(20)
某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过200岁的老人,而今天是2014年9月 ...
- 1028 人口普查 (20 分)C语言
题目描述 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过200岁的老人,而今天是20 ...
- PAT——乙级1028
这道题花了我半个多小时,对呀乙级算是挺多时间的了. 1028 人口普查 (20 point(s)) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个 ...
随机推荐
- Emiller's Advanced Topics In Nginx Module Development
Emiller的Nginx模块开发指南 By Evan Miller DRAFT: August 13, 2009 (changes) 翻译:Kongch @2010年1月5日 0:04am -- 2 ...
- Jquery下拉效果
$('#触发元素').hover(function(){ $('#框框').slideDown(); //展开(动画效果)},function(){ $('#框框').slideUp(); //收起( ...
- SMART Goals
Once you have planned your project, turn your attention to developing several goals that will enable ...
- Boolean强制转换
数据类型 转换为true的值 转换为false的值 Boolean true false String 任何非空字符串 空字符串 Number 任何非0数字值(包括无穷大) 0和NaN Object ...
- JMeter学习-011-JMeter 后置处理器实例之 - 正则表达式提取器(三)多参数获取进阶引用篇
前两篇文章分表讲述了 后置处理器 - 正则表达式提取器概述及简单实例.多参数获取,相应博文敬请参阅 简单实例.多参数获取. 此文主要讲述如何引用正则表达式提取器获取的数据信息.其实,正则表达式提取器获 ...
- Javascript数据类型的一些注意点
1.字符串类型 substring()返回指定索引区间的子串: var s = 'hello, world' s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello ...
- LeetCode One Edit Distance
原题链接在这里:https://leetcode.com/problems/one-edit-distance/ Given two strings S and T, determine if the ...
- Java Main Differences between Java and C++
转载自:http://www.cnblogs.com/springfor/p/4036739.html C++ supports pointers whereas Java does not. But ...
- OC 对象和匿名对象
OC 对象和匿名对象 对象和匿名对象的定义: 当new出一个对象时,如果用一个指针接收这个对象,那么这个指针通常被称为对象. 如果new出的对象,不用指针接收,那么这个对象就称为匿名对象. #impo ...
- xp系统的安装SVN
xp系统安装SVN,出现错误: 解决办法: 1,首先确定xp体统是否为sp3,SVN安装需要在sp3以上: 2,检查windows Installer是否开启,解决:控制面板-管理工具-服务—wind ...