最开始我写的
#include<iostream>
#include<algorithm>
using namespace std;
#include<cstring>
struct Peo
{
string name;
int year;
int month;
int day;
};
bool cmp(Peo a, Peo b)
{
if (a.year != b.year)
{
return a.year < b.year;
}
else if (a.year == b.year && a.month != b.month)
{
return a.month < b.month;
}
else if (a.year == b.year && a.month == b.month)
{
return a.day < b.day;
}
}
int main()
{
Peo arr[100000];
int n;
cin >> n;
char c;
string s1;
int n1;
int n2;
int n3;
int num = 0;
for (int i = 0; i < n; i++)
{
cin >> s1 >> n1 >> c >> n2 >> c >> n3;
if (((n1 < 1814) || (n1 == 1814 && n2 < 9) || (n1 == 1814 && n2 == 9 && n3 < 6)) || ((n1 > 2014) || (n1 == 2014 && n2 > 9) || (n1 == 2014 && n2 == 9 && n3 > 6)))
{
arr[i].year = 2015;
}
else
{
arr[i].name = s1;
arr[i].year = n1;
arr[i].month = n2;
arr[i].day = n3;
num++;
}
}
sort(arr, arr + n, cmp);
if (num == 0)
cout << 0;
else
cout << num << " " << arr[0].name << " " << arr[num - 1].name;
return 0;
}
个人认为最好的版本
#include<iostream>
using namespace std;
#include<cstring>
int main()
{
string old_name, young_name;
string name, day;
string young_day = "1814/09/06", old_day = "2014/09/06";
int n;
cin >> n;
int num = n;
for (int i = 0; i < n; i++)
{
cin >> name >> day;
if (day<"1814/09/06" || day>"2014/09/06")
num--;
else
{
if (day <= old_day)
{
old_name = name;
old_day = day;
}
if (day >= young_day)
{
young_name = name;
young_day = day;
}
}
}
if (!num)
cout << 0;
else
cout << num << " " << old_name << " " << young_name;
return 0;
}
思路可学习的版本
#include<stdio.h>
struct Birthday{
char str[6];//姓名
int y,m,d;//出生日期
int flag;//是否有效
int x;
}a[100001];
int main(){
int N,i;
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%s",a[i].str);
scanf("%04d/%02d/%02d",&a[i].y,&a[i].m,&a[i].d);
a[i].x=a[i].y*10000+a[i].m*100+a[i].d;//将出生日期转变为8位整数,这里是程序的精髓,转化为整数形式
//易于判断数据是否有效和后续比较年龄大小
if(a[i].x<18140906)//if(a[i].y<1814||(a[i].y==1814&&a[i].m<9)||(a[i].y==1814&&a[i].m==9&&a[i].d<6))
a[i].flag=0;
else if(a[i].x>20140906)//else if(a[i].y>2014||(a[i].y==2014&&a[i].m>9)||(a[i].y==2014&&a[i].m==9&&a[i].d>6))
a[i].flag=0;
else
a[i].flag=1;
}
int num=0,maxbir=20140906,minbir=18140906;//maxbir为最年长者,初始值取最年幼的出生日期20140906;min同理
int m,n;//m,n用于记录最年长和年幼者数组下标
for(i=0;i<N;i++){
if(a[i].flag){
num++;
if(maxbir>=a[i].x){//此处求最年长者,故其出生日期最早,即x数值最小
maxbir=a[i].x;
m=i;
}
if(minbir<=a[i].x){//此处求最年幼者,故其出生日期最晚,即x数值最大
minbir=a[i].x;
n=i;
}
}
}
printf("%d",num);
if(num){//此处设置if语句是考虑num==0时,应该只输出0,且末尾无空格
printf(" ");
printf("%s ",a[m].str);
printf("%s",a[n].str);
}
return 0;
}