1028 人口普查

2023-10-07 21:20
文章标签 1028 人口普查

本文主要是介绍1028 人口普查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.问题:

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

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 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

二.思路:

1.本题可把输入的生日转换为八位数,这样便于比较得出最年长或最年轻的人,因为题目说了保证最年长和最年轻的人没有并列。所以最年长或最年轻的人有且只有一个。

2.使用结构数组来存储信息更方便。

3.将超过 200 岁的生日和未出生的生日过滤掉。也就是八位数小于18140906和大于20140906的删除。

4.本题容易忽略的一个点就是:对有效生日个数为0个的特殊情况的处理。若有效生日个数为0个则不存在最年长或最年轻的人,相应的,只需输出有效生日个数即可(0),不需要输出最年长或最年轻的人的姓名。

三.代码实现:

#include<stdio.h>
#include<stdlib.h>typedef struct person{char *name;int birth;} People;//快速排序
void quick_sort(People*people,int low,int high)
{int i = low;int j = high;int t = i;char *temp_name = people[t].name;int temp_birth = people[t].birth;char *name;int birthday=0;if(i > j){return;}while(i != j){while(people[j].birth >= temp_birth && i < j){j--;}while(people[i].birth <= temp_birth && i < j){i++;}//交换值name = people[j].name;birthday = people[j].birth;people[j].name = people[i].name;people[j].birth = people[i].birth;people[i].name = name;people[i].birth = birthday;}//交换值people[t].name = people[i].name;people[t].birth = people[i].birth;people[i].name = temp_name;people[i].birth = temp_birth;//递归quick_sort(people,low,i-1);quick_sort(people,i+1,high);
}//转换八位数
int switch_num(int num1,int num2,int num3)
{int result = num1*10000+num2*100+num3;return result;
}int main()
{//输入数据int N=0;scanf("%d",&N);People people1[N];int num1=0;int num2=0;int num3=0;char c1,c2;for(int i = 0;i <N;i++){people1[i].name = (char*)malloc(sizeof(char)*6);scanf("%s %4d%c%2d%c%2d",people1[i].name,&num1,&c1,&num2,&c2,&num3);people1[i].birth = switch_num(num1,num2,num3);}//过滤掉不合理的信息int sum = N;for(int i =0;i<N;i++){//超过两百岁的去除if(people1[i].birth < 18140906){people1[i].name = NULL;sum--;}//还没出生的去除else if(people1[i].birth > 20140906){people1[i].name = NULL;sum--;}}//提取有效数据People people2[sum];for(int i =0,m=0;i<N;i++){if(people1[i].name != NULL){people2[m].name = (char*)malloc(sizeof(char)*6);people2[m].name = people1[i].name;people2[m].birth = people1[i].birth;m++;}}//生日排序quick_sort(people2,0,sum-1);//排序结果:出生日期最早的排第一位,出生日期最晚的排最后一位//输出数据//输出有效生日的个数if(sum == 0){printf("%d",sum);}else{printf("%d %s %s\n",sum,people2[0].name,people2[sum-1].name);}return 0;
}

这篇关于1028 人口普查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160538

相关文章

Web Navigation POJ 1028 栈操作

模拟平时上网打开网页的操作,值得注意的是,如果BACK回一个网页之后进行VISIT操作,之前的网页FORWARD都回不去了 #include<cstdio>#include<cstring>#include<iostream>#include<stack>using namespace std;#define MAXD 20#define MAX_SIZE 100 + 10co

九度考研真题 浙大 2008-3浙大1028:继续畅通工程

//题目1028:继续畅通工程 #include<iostream> #include<algorithm> using namespace std; int Tree[1010]; int findRoot(int x){ if(Tree[x]==-1) return x; else { int tmp=findRoot(Tree[x]); Tree[

codevs 1028 花店橱窗布置 最小费用最大流

花与花瓶连边,容量为1,费用为对应费用,s向花连边,容量为1,费用为0,花瓶向t连边,容量为1,费用为0。这里要求最大费用,把费用设为相反数,结果也取相反数。 #include<iostream>#include<cstring>#include<cstdio>#include<queue>#define inf 1000000000using namespace std;int

ArcGIS热点分析 (Getis-Ord Gi*)——基于地级市尺度的七普人口普查数据的热点与冷点分析

先了解什么是热点分析 ? 热点分析 (Getis-Ord Gi*) 是一种用于空间数据分析的技术,主要用于识别地理空间数据中值的聚集模式,可以帮助我们理解哪些区域存在高值或低值的聚集,这些聚集通常被称为“热点”或“冷点”,Gi* 统计量为数据集中的每个要素(例如地图上的点或区域)计算一个z得分。这个z得分可以用来判断在该位置附近是否存在显著的高值或低值聚集。 热点分析 (Getis-Ord G

vijos 1028 最长上升序列。

vijos 1028 换一个角度看问题。这道题其实就是一个上升序列。 如:a,aa,aaa,aaaa.一个另类的上升序列。 然后弱弱的试了是二分查找。很理想。不过却是个错误的思路。 朴素的上升序列求法 代码: #include <iostream>#include <string.h>#include <algorithm>using namespace std;char

ArcGIS热点分析 (Getis-Ord Gi*)——七普地级市人口普查数据的热点与冷点分析

先了解什么是热点分析 ? 热点分析 (Getis-Ord Gi*) 是一种用于空间数据分析的技术,主要用于识别地理空间数据中值的聚集模式,可以帮助我们理解哪些区域存在高值或低值的聚集,这些聚集通常被称为“热点”或“冷点”,Gi* 统计量为数据集中的每个要素(例如地图上的点或区域)计算一个z得分。这个z得分可以用来判断在该位置附近是否存在显著的高值或低值聚集。 热点分析 (Getis-Ord G

PAT-1028

题目描述 某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。 输入描述: 输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个

1028 - 输入一个三位数,把个位和百位对调后输出

问题描述 输入一个三位自然数,然后把这个数的百位数与个位数对调,输出对调后的数。 输入 输入一行,只有一个整数 x(100≤x≤999) 。 输出 输出只有一行,包括 1 个整数。 样例 输入 123 输出 321 输入 120 输出 21 代码1 #include <iostream>int main() {int x;std::cin >> x;int hund

Light OJ 1028 Trailing Zeroes (I) 求n因子数

题目来源:Light OJ 1028 题意:求一个数转化成任意进制后末尾有0的种数 就是一个数因子的个数 思路:一个数可以被分解成若干素数相乘 p1^x1*p2^x2*...*pn^xn 根据乘法原理 因子数为 (x1+1)*(x2+1)*...*(xn+1) 注意剪枝 #include <cstdio>#include <cstring>#include <cmath>#inc

PAT-乙级 1028 人口普查(C语言)

借鉴:https://blog.csdn.net/qq_40941722/article/details/94429909 有错版本:2020/06/21 02:16:12 #include<stdio.h>#include<stdlib.h>#include<string.h>int queryAgeLegitimacy(char* age) {int year, month, day