L2-007. 家庭房产
Posted Simon_X
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了L2-007. 家庭房产相关的知识,希望对你有一定的参考价值。
L2-007. 家庭房产
时间限制 400ms 内存限制 65536kB
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式给出一个人的房产:
编号 父 母 k 孩子1 ... 孩子k 房产套数 总面积
其中 编号 是每个人独有的一个4位数的编号;父 和 母 分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0<=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
题解:
并查集,水题……
稍微弄个结构体,改一下初始化方式就可以了。
代码 C+:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 #define MX 10005 6 int map[MX]; 7 int fid(int a) { 8 if (a == -1) return -1; 9 if (map[a] == -1) return map[a] = a; 10 return map[a] == a ? a : map[a] = fid(map[a]); 11 } 12 void link(int u, int v) { 13 u = fid(u); v = fid(v); 14 if (v == -1) return; 15 if (u < v) { u ^= v; v ^= u; u ^= v; } 16 map[u] = map[v]; 17 } 18 19 struct Point { 20 int sum, sHom; double sAre; 21 double pAre() { return sAre / sum; } 22 double pSum() { return (double)sHom / sum; } 23 }data[MX]; 24 bool cmp(int a, int b) { 25 if (std::fabs(data[a].pAre() - data[b].pAre()) < 0.00001) return a < b; 26 return data[a].pAre() > data[b].pAre(); 27 } 28 29 void red() { 30 memset(map, -1, sizeof map); 31 int n, i, j, chil, now, fth, mth, sChil; 32 scanf("%d", &n); 33 for (i = 0; i < n; ++i) { 34 scanf("%d%d%d%d", &now, &fth, &mth, &sChil); 35 link(now, fth); link(now, mth); 36 for (j = 0; j < sChil; ++j) { scanf("%d", &chil); link(now, chil); } 37 scanf("%d%lf", &data[now].sHom, &data[now].sAre); 38 } 39 } 40 41 int main() { 42 red(); 43 int i, pre, opt[MX], iOpt; 44 for (i = iOpt = 0; i < MX; ++i) { 45 if (map[i] == -1) continue; 46 if (map[i] == i) { opt[iOpt++] = i; data[i].sum = 1; } 47 else { 48 pre = fid(i); 49 ++data[pre].sum; data[pre].sHom += data[i].sHom; data[pre].sAre += data[i].sAre; 50 } 51 } 52 std::sort(opt, opt + iOpt, cmp); printf("%d\n", iOpt); 53 for (i = 0; i < iOpt; ++i) { 54 pre = opt[i]; 55 printf("%0*d %d %.3lf %.3lf\n", 4, opt[i], data[pre].sum, data[pre].pSum(), data[pre].pAre()); 56 } 57 return 0; 58 }
以上是关于L2-007. 家庭房产的主要内容,如果未能解决你的问题,请参考以下文章