概述
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
做到后面,感觉PAT基础题,感觉上不难,思路通常不会太复杂,但是要完全写对代码拿到分数,并不是件容易的事情,这两天脑子有点晕,这题又是只有15分,先放在这里,好好思考一下
#include<vector>
#include <sstream>
#include<cmath>
#include<iomanip>
#include<iostream>
#include <ctype.h>
#include <stdlib.h>
using namespace std;
struct Person//定义一个结构体,其实获取可以直接用二维数组实现,可以省内存啊
{
string name;
string brith;
};
struct ComparedPerson//定义一个结构体,存放标准格式的人物信息,将年份,月份,日期分开了的
{
string name;//姓名
int year;//出生年
int month;//出生月
int day;//出生日
};
int main()
{
int n;
cin >> n;
vector<Person> persons;
for (int i = 0; i < n; i++)//循环输入人物信息
{
Person pers;
cin >> pers.name;
cin >> pers.brith;
persons.push_back(pers);
}
/*Person pers1;//用于测试的代码
pers1.name = "John";
pers1.brith = "1814/09/12";
persons.push_back(pers1);
Person pers2;
pers2.name = "Tom";
pers2.brith = "1814/09/06";
persons.push_back(pers2);
Person pers3;
pers3.name = "Ann";
pers3.brith = "2121/01/30";
persons.push_back(pers3);
Person pers4;
pers4.name = "James";
pers4.brith = "1814/09/05";
persons.push_back(pers4);
Person pers5;
pers5.name = "Steve";
pers5.brith = "1967/11/20";
persons.push_back(pers5);*/
vector<ComparedPerson> comparedPersons;
int hefa = 0;
for (int i = 0; i < persons.size(); i++)//本循环用于将符合条件的人物信息,存到新的结构体中,用作比较
{
ComparedPerson compareperson;
string brith = persons[i].brith;//每一条生日记录
int brithlength = brith.length();
int day = (brith[brithlength - 2]-'0')*10 + (brith[brithlength - 1]-'0');//分别获取年,月,日信息
int month = (brith[brithlength - 5] - '0')*10 + (brith[brithlength - 4] - '0');
int year = 0;
if (brithlength == 10)
{
year = (brith[0] - '0') * 1000 + (brith[1] - '0') * 100 + (brith[2] - '0') * 10 + (brith[3] - '0');
}
if (year == 1814) //判断是否符合题中所说的条件,不超过200岁的,不超过今天出生的
{
if (month == 9)
{
if (day >= 6)
{
compareperson.name = persons[i].name;//获取这里可以直接用于找出最大的和最小的
compareperson.year = year;
compareperson.month = month;
compareperson.day = day;
comparedPersons.push_back(compareperson);
}
}
else if (month>9)
{
compareperson.name = persons[i].name;
compareperson.year = year;
compareperson.month = month;
compareperson.day = day;
comparedPersons.push_back(compareperson);
}
}
else if (year==2014)
{
if (month == 9)
{
if (day <= 6)
{
compareperson.name = persons[i].name;
compareperson.year = year;
compareperson.month = month;
compareperson.day = day;
comparedPersons.push_back(compareperson);
}
}
else if (month<9)
{
compareperson.name = persons[i].name;
compareperson.year = year;
compareperson.month = month;
compareperson.day = day;
comparedPersons.push_back(compareperson);
}
}
else if ((year<2014) && (year>1814))
{
compareperson.name = persons[i].name;
compareperson.year = year;
compareperson.month = month;
compareperson.day = day;
comparedPersons.push_back(compareperson);
}
}
ComparedPerson max_age = comparedPersons[0];//存放年龄最大和年龄最小人的信息
ComparedPerson min_age = comparedPersons[0];
for (int i = 0; i < comparedPersons.size(); i++)
{
if (comparedPersons[i].year<max_age.year)//用于依次比较,找出年龄最大和最小的人。年份相同时,比较月份,以此类推
{
max_age = comparedPersons[i];
}
else if (comparedPersons[i].year > min_age.year)
{
min_age = comparedPersons[i];
}
else if (comparedPersons[i].year == min_age.year)
{
if (comparedPersons[i].month>min_age.month)
{
min_age = comparedPersons[i];
}
else if (comparedPersons[i].month==min_age.month)
{
if (comparedPersons[i].day > min_age.day)
{
comparedPersons[i] = min_age;
}
}
}
else if (comparedPersons[i].year == max_age.year)
{
if (comparedPersons[i].month<max_age.month)
{
max_age = comparedPersons[i];
}
else if (comparedPersons[i].month == max_age.month)
{
if (comparedPersons[i].day < max_age.day)
{
comparedPersons[i] = max_age;
}
}
}
}
cout << comparedPersons.size()<< " " << max_age.name<< " " << min_age.name;
return 0;
}
最后
以上就是风中蜗牛为你收集整理的【再思考】PATBasic——1028. 人口普查(20) 1028. 人口普查(20)的全部内容,希望文章能够帮你解决【再思考】PATBasic——1028. 人口普查(20) 1028. 人口普查(20)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复