PAT 乙级 1028 人口普查

题目

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

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

输入格式:

输入在第一行给出正整数 N,取值在(0,10​5​​];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。

输出格式:

在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。

分析

此题坑在测试点3!

换了两种方法,也测试了没有符合条件的情况,输出的也是0.

然后它还是判错了。。。可能是空字符串的问题??

你需要单独输出。

代码

(1)通过年, 月, 日 单独判断

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;
int y = 2014, m = 9 , d = 6;
const int maxn = 1e5+5;

struct People
{
    string name;
    int year , month , day;
}people[maxn];

int legal(int y , int m , int day)
{
    if(2014 - y > 200) //超过200岁的老人
        return 0;
    if( y > 2014)   //未出生
        return 0;
    else if( y == 2014) //2014/09/06
    {
        if( m > 9)
            return 0; //未出生
        else if( m == 9)
        {
            if( day > 6)
                return 0; //未出生
        }
    }
    else if( 2014 - y == 200)
    {
        if( m < 9)
            return 0;//超过年龄
        else if( m == 9)
        {
            if( day < 6)
                return 0; //超过年龄
        }
    }
    return 1;
}

bool bmp(People a , People b)
{
    if(a.year == b.year)
    {
        if(a.month == b.month)
        {
            return a.day <= b.day;
        }
        else
            return a.month <= b.month;
    }
    else
        return a.year <= b.year;
}

int main()
{
    int n;
    cin >> n;
    int idx = 0;
    for(int i = 0 ; i < n ; i++)
    {
        People tmp;
        cin >> tmp.name;
        char ch;
        scanf("%d%c%d%c%d" ,&tmp.year,&ch,&tmp.month,&ch,&tmp.day);
        if(legal(tmp.year ,tmp.month , tmp.day))
        {
            people[idx ++ ] = tmp;
           // cout << tmp.name<< endl;
        }
    }
    sort(people , people + idx , bmp);

    if(idx == 0)
        cout << 0 << endl;
    else
        cout << idx  << " " << people[0].name << " " <<people[idx - 1].name;

}

(2)通过字符串直接判断

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;
string datamax = "2014/09/06";
string datamin = "1814/09/06";
const int maxn = 1e5+5;
struct People
{
    string date;
    string name;
}people[maxn];

bool cmp(struct People a , struct People b)
{
    return a.date < b.date;
}

int main()
{
    int n;
    cin >> n;
    int idx = 0;
    for(int i = 0 ; i < n; i ++)
    {
        string s1,s2;
        cin >> s1 >> s2;
        if(s2 > datamax || s2 < datamin)
            continue;
        else
        {
            people[idx ++ ] = {s2 , s1};
        }
    }
    sort(people , people + idx ,cmp);
    if(idx == 0 )
        cout << 0 << endl;
    else
        cout << idx << " " << people[0].name << " " << people[idx - 1].name << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值