人口普查输出最年轻年迈
日期比较题。
输入格式:
输入在第一行给出正整数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
struct person
{
	char name[10];
	int yy, mm, dd;
}youngest, oldest, left, right,temp; //left & right 用来保存两个边界 
bool lessEqu(person a, person b){ //if a's date <= b's date return true
	if (a.yy != b.yy) return a.yy <= b.yy;
	else if (a.mm != b.mm) return a.mm <= b.mm;
	else return a.dd <= b.dd;
}
bool moreEqu(person a, person b){ //if a's date >= b's date return true
	if (a.yy != b.yy) return a.yy >= b.yy;
	else if (a.mm != b.mm) return a.mm >= b.mm;
	else return a.dd >= b.dd;
}
void init()
{
	right.yy = oldest.yy = 2014; 
	left.yy = youngest.yy = 1814; //pay attention to oldest & youngest's year. 
	right.mm = left.mm = youngest.mm = oldest.mm = 9;
	right.dd = left.dd = youngest.dd = oldest.dd = 6;
}
int main(){
	int n;
	int count = 0;
	cin>>n;
	init();
	for (int i = 0; i < n; i++)
	{
		cin>> temp.name >> temp.yy >> temp.mm >> temp.dd;
		if (lessEqu(temp, right) && moreEqu(temp, left)) //如果日期合法 
		{ 
			count++;
			if (lessEqu(temp, oldest)){   //更新oldest 
				oldest = temp;
			}
			if (moreEqu(temp, youngest)){ //更新youngest 
				youngest = temp;
			}
		}
	}
	if (count==0)
		 printf("0\n"); //所有人日期都不合法
	else
		printf("%d %s %s\n", count, oldest.name, youngest.name);
	return 0;
}
另解:
#include<stdio.h> 
#include<string.h> 
int main(){
    int n;
    int year,month,day;
    int count = 0;  //有效年龄个数
    char name[6], max_name[6], min_name[6];
    long long maxAge = 20140907, minAge = 18140905; 
    scanf("%d",&n);
    for(int i = 0; i < n; i++){
        scanf("%s %d/%d/%d",&name,&year,&month,&day);
        //方便年龄比较 
        long long birth = year*10000+month*100+day; 
        //过滤不合理日期
        if(birth < 18140906 || birth > 20140906);
        else{          //得到最年长和最年轻的人
            count++;
            if(birth < maxAge){ //得到最年长 
                strcpy(max_name,name);
                maxAge = birth; 
            }
            if(birth > minAge){ //得到最年轻 
                strcpy(min_name,name);
                minAge = birth;
            }       
        } 
    }
    if(count)
        printf("%d %s %s\n",count,max_name,min_name); 
    else
        printf("0\n");
    return 0;
}
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号