• 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
     */
    

    思路

    // 把符合要求的人放到map中,map自动按key value 升序排列
    

    代码

    #include <cstdio>
    #include <iostream>
    #include <string>
    #include <map>
    #include <fstream>
    //#include <>
    
    using namespace std;
    
    struct Date{
    	int year;
    	int month;
    	int day;
    	
    	void init(int y,int m, int d){
    		year = y;
    		month = m;
    		day = d;
    	}
    	
    	bool hefa(){
    		//2014年9月6日
    		Date now;
    		now.init(2014, 9, 6);
    		Date last;
    		last.init(1814, 9, 6);
    		if( *this < last || now < *this)return false;
    		return true;
    	}
    	friend bool operator < (const Date &a, const Date &b){
    		if (a.year < b.year) return true;
    		if (a.year == b.year && a.month < b.month) return true;
    		if (a.year == b.year && a.month == b.month && a.day < b.day) return true;
    		return false;
    	}
    };
    
    int main(){
    	int n;
    	
    //	ifstream cin("/Users/apple/Desktop/input.txt");
    	
    	cin >> n;
    	
    	map<Date,string> data;
    	
    	string name;
    	int cnt = 0;
    	for (int i = 0; i < n; ++i) {
    		int y,m,d;
    		char nameCh[10];
    		scanf("%s%d/%d/%d",nameCh,&y,&m,&d);
    		
    		name = nameCh;
    		Date date;
    		date.init(y,m,d);
    		if (date.hefa()) {
    			data[date] = name;
    			cnt++;
    		}
    	
    	}
    	
    //	printf("%d %s %s",cnt,data[0].second.c_str(),data[0].second.c_str());
    	if(cnt >0){
    		map<Date,string>::iterator i = data.begin();
    	
    		cout << cnt << ' ';
    		cout << i->second << ' ';
    		map<Date,string>::reverse_iterator j = data.rbegin();
    		cout << j->second << endl;
    	}else{
    		cout << cnt << endl;
    	}
    	
    }
    

    过程资料

    注意:

    1. 需要考虑没有符合条件的人的情况

    测试点:
    倒数第二个测试点是特判,用于测试所有输入都是无效输入的情况下代码是否正确运行。

  • 相关阅读:
    Postman测试写法的问题
    Spring Cloud
    Swagger2构造RESTful API开发Java Web
    web前端三大框架(主流Vue.js)
    zookeeper
    分布式服务介绍
    2019年java技术大盘点
    refusing to merge unrelated histories
    PPT制作不加班的十个小窍门
    如何快速完成一份学术型PPT
  • 原文地址:https://www.cnblogs.com/tangyikejun/p/4300392.html
Copyright © 2020-2023  润新知