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)) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个 ...
随机推荐
- House Building---hdu5538(求表面积水题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5538 题意:有一个三维的图形,先给出平面图是n*m的矩形,每个位置都有不同个数的方块,a[i][j]代 ...
- 将Excel导入SQL Server 只能导入数字,其他数据变为NULL怎么解决?
先新建一个TXT文件,把数据粘贴进去 再新建一个Excel文件,在菜单栏中选Data再选From Text 找到txt文件,点import 一定要选Text 点Finish,点OK. 接下来在往数据库 ...
- UVA 10127题目的解答
#include <iostream>#include <cstdio>#include <cmath> int main(){ int num; while (s ...
- 图像分割之(五)活动轮廓模型之Snake模型简介
在"图像分割之(一)概述"中咱们简单了解了目前主流的图像分割方法.下面咱们主要学习下基于能量泛函的分割方法.这里学习下Snake模型简单的知识,Level Set(水平集)模型会在 ...
- getconf 命令
getconf 命令 用途 将系统配置变量值写入标准输出. 系统的默认参数,比如mkfs读取默认参数,并格式化,默认PAGESIZE是4096 语法 getconf [ -v specificatio ...
- uwsgi + nigix + django的样式展示
编辑添加黄色部分 是你的项目目录 在你的项目目录写的静态文件 内的样式调用的是static 如果不是 请改名 [root@ayibang-server s10day11]# vim /etc/ng ...
- android关于The connection to adb is down, and a severe error has occured.这个问题的解决办法
有时在打开模拟器的时候会出现The connection to adb is down, and a severe error has occured.这个问题,这个问题的解决办法有两个: 方法一:找 ...
- Android --SwipeRefreshLayout 下拉刷新
1.Layout <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/id_swipe_ly" an ...
- OSG第一个Demo
环境:Vs2010 OpenSceneGraph-3.0.1-VS10.0.30319-x86-debug-12741 OpenSceneGraph-3.0.1-VS10.0.30319-x86-re ...
- SQL将一张表中的数据插入到另一张表
将表T_wz_wz中的部分数据插入到表t_wz_kc: ,,'Y' from t_wz_wz where yxbz='Y' --去重复 -- and wzid not in (select wzid ...