L2-007. 家庭房产
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数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 没有坑点,就是简单的并查集+排序#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <algorithm> #include <queue> #include <stack> #include <vector> #include <set> using namespace std; typedef long long LL; const int Max = 11000; int fa[Max], vis[Max]; struct node { int id; int s; int sn; }num[Max]; struct node2 { int id; double s, sn; int num; } ans[Max], arr[Max]; int find(int x) { return x == fa[x]?x:fa[x] = find(fa[x]); } void ju(int x, int y) { int rx = find(x); int ry = find(y); if(rx != ry) { if(rx > ry) { fa[rx] = ry; } else { fa[ry] = rx; } } } bool cmp(node2 x, node2 y) { if(x.sn == y.sn) return x.id < y.id; return x.sn > y.sn; } int main() { int i, j; int m, n; int x, p1, p2, y, s, sn; cin>>n; memset(vis, 0, sizeof vis); for(i = 0; i < Max; i++) { fa[i] = i; } for(i = 0; i < n; i++) { scanf("%d %d %d %d", &x, &p1, &p2, &m); num[i].id = x; vis[x] = 1; if(p1 != -1) { ju(x, p1); vis[p1] = 1; } if(p2 != -1) { ju(x, p2); vis[p2] = 1; } for(j = 0; j < m; j++) { scanf("%d", &y); if(y != -1) { ju(x, y); vis[y] = 1; } } scanf("%d %d", &num[i].s, &num[i].sn); } for(i = 0; i < Max; i++) { ans[i].id = 0; ans[i].s = 0; ans[i].sn = 0; if(vis[i]) { int t = find(i); ans[t].num++; } else { ans[i].num = 0; } } for(i = 0; i < n; i++) { int t = num[i].id; t = find(t); ans[t].id = 1; ans[t].s += num[i].s; ans[t].sn += num[i].sn; } j = 0; for(i = 0; i < Max; i++) { if(vis[i]) { if(ans[i].id == 1) { arr[j].id = i; arr[j].num = ans[i].num; arr[j].s = 1.0*ans[i].s/ans[i].num; arr[j++].sn = 1.0*ans[i].sn/ans[i].num; } } } sort(arr, arr+j, cmp); cout<<j<<endl; for(i = 0; i < j; i++) { printf("%04d %d %.3lf %.3lf\n", arr[i].id, arr[i].num, arr[i].s, arr[i].sn); } return 0; }