【天梯赛-练习题】L2-007 家庭房产
2016-06-09 13:50
393 查看
题目:
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式给出一个人的房产:
编号 父 母 k 孩子1 … 孩子k 房产套数 总面积
其中 编号 是每个人独有的一个4位数的编号;父 和 母 分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0<=k<=5)是该人的子女的个数;孩子i是其子女的编号。
输出格式:
首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:
家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。
解题思路:一开始还想着有没有简便的方法,最后放弃,直接解题。用并查集的方法来组建家庭,组建时以序号最小者为关键字。
代码:
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式给出一个人的房产:
编号 父 母 k 孩子1 … 孩子k 房产套数 总面积
其中 编号 是每个人独有的一个4位数的编号;父 和 母 分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0<=k<=5)是该人的子女的个数;孩子i是其子女的编号。
输出格式:
首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:
家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。
解题思路:一开始还想着有没有简便的方法,最后放弃,直接解题。用并查集的方法来组建家庭,组建时以序号最小者为关键字。
代码:
#include<iostream> #include<algorithm> using namespace std; typedef struct { int me,ma,pa; int child[6]; int hNum; double hArea; }Man; typedef struct { int id; int num; double hnum; double harea; }House; Man man[1010]; House house[1010]; int fang[10010]; int visited[10010]; int visited2[10010]; int AllHomeNum[10010]; double AllHomeArea[10010]; int AllManNum[10010]; int FindHome(int a) { if(a == fang[a]) return a; else return fang[a] = FindHome(fang[a]); } void CreateHome(int a,int b) { int ah = FindHome(a); int bh = FindHome(b); if(ah < bh) fang[bh] = ah; else if(bh < ah) fang[ah] = bh; } int main() { int i,j; int k; int n; int ccount = 0; int ID; scanf("%d",&n); ///初始化,自己是一个家庭 for(i=0;i<10000;i++) fang[i] = i; ///输入同时建立家庭(以编号最小为建立标准) for(i=0;i<n;i++) { scanf("%d%d%d",&man[i].me,&man[i].ma,&man[i].pa); visited[man[i].me] = 1; if(man[i].ma != -1) { CreateHome(man[i].me,man[i].ma); visited[man[i].ma] = 1; } if(man[i].pa != -1) { CreateHome(man[i].me,man[i].pa); visited[man[i].pa] = 1; } scanf("%d",&k); for(j=0;j<k;j++) { scanf("%d",&man[i].child[j]); CreateHome(man[i].me,man[i].child[j]); visited[man[i].child[j]] = 1; } scanf("%d%lf",&man[i].hNum,&man[i].hArea); } for(i=0;i<n;i++) { ID = FindHome(man[i].me); AllHomeNum[ID] += man[i].hNum; AllHomeArea[ID] += man[i].hArea; } for(i=0;i<10000;i++) { if(visited[i] == 1) { AllManNum[FindHome(i)]++; } } for(i=0;i<10000;i++) { if(visited[i] == 1) { ID = FindHome(i); if(visited2[ID] == 0) { house[ccount].id = ID; house[ccount].num = AllManNum[ID]; house[ccount].hnum = (AllHomeNum[ID] * 1.0) / AllManNum[ID]; house[ccount].harea = (AllHomeArea[ID] * 1.0) / AllManNum[ID]; visited2[ID] = 1; ccount++; } } } for(i=0;i<ccount;i++) { for(j=i+1;j<ccount;j++) { if(house[i].harea < house[j].harea) swap(house[i],house[j]); else if(house[i].harea == house[j].harea && house[i].id > house[j].id) swap(house[i],house[j]); } } printf("%d\n",ccount); for(i=0;i<ccount;i++) printf("%04d %d %.3lf %.3lf\n",house[i].id,house[i].num,house[i].hnum,house[i].harea); return 0; }
相关文章推荐
- Linux C函数参考手册(PDF版)
- C# partial关键字说明
- Lua教程(十七):C API简介
- 简单谈谈lua和c的交互
- C#用链式方法表达循环嵌套
- C#中的委托数据类型简介
- C#编写的艺术字类实例代码
- C#实现打造气泡屏幕保护效果
- 举例讲解C#编程中委托的实例化使用
- 使用C#代码获取存储过程返回值
- C++中explict关键字用法
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 字符串的组合算法问题的C语言实现攻略
- C 语言基础教程(我的C之旅开始了)[三]
- 学习C和C++的9点经验总结
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- 最大子矩阵问题实例解析