深圳银行网站建设,html5布局wordpress,北京市工商注册网上服务系统,电商美工的工作内容是什么L2-007 家庭房产 (25分) 给定每个人的家庭成员和其自己名下的房产#xff0c;请你统计出每个家庭的人口数、人均房产面积及房产套数。 输入格式#xff1a;
输入第一行给出一个正整数N#xff08;≤1000#xff09;#xff0c;随后N行#xff0c;每行按下列格式给出一个…L2-007 家庭房产 (25分) 给定每个人的家庭成员和其自己名下的房产请你统计出每个家庭的人口数、人均房产面积及房产套数。 输入格式
输入第一行给出一个正整数N≤1000随后N行每行按下列格式给出一个人的房产 编号 父 母 k 孩子1 … 孩子k 房产套数 总面积 其中编号是每个人独有的一个4位数的编号父和母分别是该编号对应的这个人的父母的编号如果已经过世则显示-1k0≤k≤5是该人的子女的个数孩子i是其子女的编号。 输出格式
首先在第一行输出家庭个数所有有亲属关系的人都属于同一个家庭。随后按下列格式输出每个家庭的信息 家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积 其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出若有并列则按成员编号的升序输出。 输入样例
10 6666 5551 5552 1 7777 1 100 1234 5678 9012 1 0002 2 300 8888 -1 -1 0 1 1000 2468 0001 0004 1 2222 1 500 7777 6666 -1 0 2 300 3721 -1 -1 1 2333 2 150 9012 -1 -1 3 1236 1235 1234 1 100 1235 5678 9012 0 1 50 2222 1236 2468 2 6661 6662 1 300 2333 -1 3721 3 6661 6662 6663 1 100 输出样例
3 8888 1 1.000 1000.000 0001 15 0.600 100.000 5551 4 0.750 100.000 这题一开始没什么思路感觉计算量很大后来参考了别人的代码恍然大悟刚开始看的时候可能有点蒙。
#includeiostream
#includeset
#includevector
#includemap
#includealgorithm
using namespace std;
const int maxn 10000;
int pre[maxn];
struct node {//存储开始输入的人的基本信息int id, house;double area;
};
struct family {//输出的家庭结构体int id, number;double house, area;
};
bool cmp(family a, family b)//自定义比较函数
{if (a.area ! b.area)return a.area b.area;else return a.id b.id;
}
int find(int x)//并查集模板查找
{while (x ! pre[x]) x pre[x];return x;
}
void merge(int x, int y)//并查集模板合并
{int a find(x);int b find(y);if (a ! b) pre[a] b;
}
int main()
{int n, x;cin n;setints;//存储每人的编号默认升序mapint, nodenodes;//记录人的房产信息for (int i 0; i maxn; i)pre[i] i;//初始化pre数组for (int i 0; i n; i){int id, p1, p2, k, house, id1;//分别记录编号 父 母 k 孩子1 ... 孩子k 房产套数double area;// 总面积cin id p1 p2 k;s.insert(id);//插入idif (p1 ! -1)//有爸爸{s.insert(p1);merge(id, p1);}if (p2 ! -1)//有妈妈{s.insert(p2);merge(id, p2);}for (int j 0; j k; j)//随后的家庭成员{cin id1;s.insert(id1);merge(id1, id);}cin house area;nodes[id] node{ id,house,area };//记录该人的家庭信息}setints1;//记录家庭编号也可以理解记录着每个家庭的老大mapint, vectorintm;//记录家庭编号和成员编号for (auto it s.begin(); it ! s.end(); it){int fa find(*it);m[fa].push_back(*it);s1.insert(fa);}cout s1.size() endl;//输出家庭的个数vectorfamilyv1;for (auto it s1.begin(); it ! s1.end(); it){int fa *it;double house 0, area 0;for (auto tmp 0; tmp m[fa].size(); tmp)//将每个家庭的成员及其房产计算汇总放入family结构体中{house nodes[m[fa][tmp]].house;area nodes[m[fa][tmp]].area;}v1.push_back(family{ m[fa][0],int(m[fa].size()),house * 1.0 / (int)m[fa].size(),area * 1.0 / (int)m[fa].size() });}sort(v1.begin(), v1.end(), cmp);//进行排序for (int i 0; i v1.size(); i) {printf(%04d %d %.3lf %.3lf, v1[i].id, v1[i].number, v1[i].house, v1[i].area);if (i v1.size() - 1) puts();}
}