https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805068539215872?type=7&page=1
题意:
依次为编号 父 母 k 孩子1 ... 孩子k 房产套数 总面积
请你统计出每个家庭的人口数、人均房产面积及房产套数。编号是-1就是已经过世,按照人均面积降序输出
家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
结构体内嵌比较函数类似于cmp,放在里面可以自动排序
struct node
{
int r;
bool operator <(const node &a)const{
return r < a.r;
}
}a[10];
const int N = 10005;
int n;
int p[N];
int housecnt[N], areacnt[N], cnt[N];
set<int>ps;
struct node
{
int id, cnt;
double avghouse, avgarea;
bool operator < (const node & o)const
{
if(this -> avgarea == o.avgarea)
return id < o.id;
return avgarea > o.avgarea;
}
};
vector<node>res;
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
void merge(int a, int b) //合并
{
a = find(a), b = find(b);
if(a < b) swap(a, b);
p[a] = b;
}
int main()
{
cin >> n;
for(int i = 0; i < N; i ++) p[i] = i; //初始化
while(n --)
{
int id, fa, ma, k;
cin >> id >> fa >> ma >> k;
ps.insert(id);
if(fa != -1)
{
ps.insert(fa);
merge(id, fa);
}
if(ma != -1)
{
ps.insert(ma);
merge(id, ma);
}
while(k --)
{
int child; cin >> child;
ps.insert(child);
merge(child, id);
}
int house, area;
cin >> house >> area;
housecnt[id] += house;
areacnt[id] += area;
}
for(auto x : ps)
{
int f = find(x);
cnt[f] ++;
if(x != f)
{
housecnt[f] += housecnt[x];
areacnt[f] += areacnt[x];
}
}
for(auto x : ps)
{
if(x == p[x])
//cout << housecnt[x] * 1.0 / cnt[x] << " " ;
res.push_back({x, cnt[x], housecnt[x]*1.0/cnt[x], 1.0*areacnt[x]/cnt[x]});
}
sort(res.begin(), res.end());
cout << res.size() << endl;
for(auto x : res)
{
printf("%04d %d ", x.id, x.cnt);
cout << fixed << setprecision(3);
cout << x.avghouse << " " << x.avgarea << endl;
}
return 0;
}