立志用更少的代码做更高效的表达


某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:
输入在第一行给出正整数 N,取值在(0,10^​5 ];随后 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


问题分析:

两种解法:

解法一:定义结构体, 存放数据, 定义结构体比较大小的函数, 分别比较出最大值和最小值即可。

解法二:由于所有日期都是合法的, 因此只需比较日期是否在范围内即可。 于是可以将日期转化为int型变量比较, 提高效率。


要注意的是:

1、无论哪种解法, 都一定要输入一个数,就判断一个数, 即时存储和操作, 而不能存放在数组里再遍历, 这样会超时。

2、如果依然超时, 可以试着将C++代码换成C语言代码, 因为C语言比C++快一些。

3、如果没有符合的,则输出0, 后面没有空格。 (测试点三)


二更:
经评论区提醒, 可以采用部分模拟的实现方法, 只用了16行代码实现AC。 比起结构体这种中规中矩的模拟解法效率高出不少。


一更:结构体解法

#include<iostream>
using namespace std;struct Birthday{string name;int year, month, day;
}; bool compare(Birthday b1, Birthday b2){ //比较,按年月日排序 if(b1.year != b2.year) return b1.year<b2.year;else {if(b1.month != b2.month) return b1.month<b2.month;else {return b1.day < b2.day;}}
} bool fuhe(Birthday b1) {  //判断是否符合if(b1.year < 1814) return false;else if(b1.year == 1814) {if(b1.month < 9) return false;else if(b1.month == 9) {if(b1.day < 6) return false;}}if(b1.year>2014) return false;else if(b1.year == 2014) {if(b1.month > 9) return false;else if(b1.month == 9) {if(b1.day > 6) return  false;}}return true;
}Birthday fuzhi(Birthday b1, Birthday b2) {     //结构体赋值b1.name = b2.name;b1.year = b2.year;b1.month = b2.month;b1.day = b2.day;return b1;
}int main() {Birthday Max, Min;int n; cin>>n; int num1 = 0;  //记录符合的个数 bool flag = true;for(int i = 0; i < n; i++) {Birthday B;cin >> B.name; scanf("%d/%d/%d", &B.year, &B.month, &B.day);if(fuhe(B)) {num1++; if(flag) {      //第一次循环时,先给Max和Min赋值flag = false;Max = fuzhi(Max, B);Min = fuzhi(Min, B); } else {if(compare(Max, B)) {Max = fuzhi(Max, B);}if(compare(B, Min)) {Min = fuzhi(Min, B);}}}}if(num1 == 0) cout << 0;else cout << num1 << ' ' << Min.name << ' ' << Max.name << endl;
return 0; }

二更代码

#include<bits/stdc++.h>
using namespace std;
int main() {int n, num = 0; cin >> n;        string s1, s2, min_y = "9", max_y = "0", min_n, max_n; while(n--) {cin >> s1 >>s2;if(!(s2 >= "1814/09/06" && s2 <= "2014/09/06")) continue;num++;  if(min_y > s2) { min_y = s2; min_n = s1; }if(max_y < s2) { max_y = s2; max_n = s1; }}cout << num;if(num) cout << ' ' << min_n << ' ' << max_n << '\n';return 0;
}

      ——错过落日余晖,请记得还有漫天星辰

测试点3错的来:1028 人口普查 (20分)(解题报告)相关推荐

  1. 1028 人口普查 (20 分)测试点3格式错误

    1028 人口普查 (20 分) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 2 ...

  2. 【2020模拟考试T3】【PAT乙】1028 人口普查 (20分) 字符串比较

    problem 1028 人口普查 (20分) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇 ...

  3. PAT乙级1028 人口普查 (20 分)

    1028 人口普查 (20 分) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 2 ...

  4. C++学习之路 | PTA乙级—— 1028 人口普查 (20 分)(精简)

    1028 人口普查 (20 分) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 2 ...

  5. 1028 人口普查 (20 分)C++ 示例代码

    1028 人口普查 (20 分) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 2 ...

  6. 【PAT (Basic Level) 】1028 人口普查 (20 分)

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人.这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...

  7. 1028 人口普查 (20 分)(c语言)

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...

  8. 1028 人口普查 (20分)

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...

  9. PAT 1028 人口普查 (20 分)

    题目描述: 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 200 岁的老人,而今天 ...

最新文章

  1. vue响应式给数组中的对象添加新属性
  2. OpenCV+python:读取图片
  3. Adobe Illustrator CS6 界面文字按钮太小,高分屏win10PS/AI等软件界面字太小解决方法
  4. C 语言编程 — GCC 工具链
  5. Codeforces Round #361 (Div. 2) B. Mike and Shortcuts bfs
  6. opencv读取手机摄像头
  7. linux学习之路--(六)用户及权限详解
  8. MFC 蜂鸣声或播放音频
  9. MySQL 数据库导出导入操作
  10. 阿里为什么禁用Executors创建线程池?
  11. script标签中的defer和async属性
  12. rabbitmq python 发送失败_python rabbitmq no_ack=false
  13. python的matplotlib画图时独立窗口_解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题...
  14. android9手机电池管家,腾讯电池管家APP
  15. 【数论】快速分解质因数的技巧 筛法求素数(快速筛)
  16. java导入导出excel文件
  17. 极速掌握HTML(一)基础入门
  18. Centi和HandCash共同开发支付握手协议
  19. Visual Studio Code 代码显示空格等空白符的方法
  20. ES6常问面试题(Promise,async和await 等)

热门文章

  1. live555 源码分析: SETUP 的处理
  2. 全站 HTTPS 就一定安全了吗?
  3. 面试官:Redis的事务满足原子性吗?
  4. 向MPEG创始人Leonardo Chiariglione提问
  5. 剑指offer之31-35题解
  6. 揭秘微信「扫一扫」识物为什么这么快?
  7. F4V 封装格式详解(一)-------box
  8. 技术分享:什么是CDN鉴权(by光网烈火)
  9. 时光机穿梭---管理修改
  10. 使用QUIC协议实现实时视频直播0卡顿