#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
int N, M, K;
const int si = 10007;
int par[si];
int cnt[si];
double area[si];
int housenum[si];
bool vis[si];
struct node {
int id, num;
double avgnum, avgarea;
}no[si];
bool cmp (node a, node b) {
if (a.avgarea != b.avgarea) return a.avgarea > b.avgarea;
return a.id < b.id;
}
using namespace std;
int find(int x) {
if (x == par[x]) return par[x];
return par[x] = find(par[x]);
}
bool same(int x, int y) {
return find(x) == find(y);
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return;
if (x < y) {
par[y] = par[x];
}
else {
par[x] = par[y];
}
}
int main() {
cin >> N;
for (int i = 0; i < si; i++) par[i] = i;
int f, m, id, k, tp;
for (int i = 0; i < N; i++) {
cin >> id >> f >> m >> k;
if (f != -1) {
unite(id, f);
vis[f] = 1;
}
if (m != -1) {
unite(id, m);
vis[m] = 1;
}
vis[id] = 1;
for (int j = 0; j < k; j++) {
scanf("%d", &tp);
unite(id, tp);
vis[tp] = 1;
}
cin >> housenum[id] >> area[id];
}
set<int> st;
for (int i = 0; i < si; i++) {
if (!vis[i]) continue;
int x = find(i);//这个家庭
cnt[x]++;//人口数++
if (x != i) {
area[x] += area[i];
housenum[x] += housenum[i];
}
st.insert(x);
}
set<int>:: iterator it = st.begin();
int count = 0;
while (it != st.end()) {
int x = *it;
no[count].id = x;
no[count].num = cnt[x];
no[count].avgnum = housenum[x] * 1.0 / cnt[x];
no[count++].avgarea = area[x] * 1.0 / cnt[x];
it++;
}
cout << count << endl;
sort (no, no + count, cmp);
for (int i = 0; i < count; i++) {
printf("%04d %d %.3f %.3f\n", no[i].id, no[i].num, no[i].avgnum, no[i].avgarea);
}
return 0;
}
L2-007 家庭房产 (25 分)
最新推荐文章于 2024-05-28 00:27:28 发布