目的:统计家庭个数,输出每个家庭人数和人均住宅,人均居住面积。
输入:
N 单个小家庭的个数
小家庭信息格式
名字 父母 孩子个数 孩子1 孩子2....住宅数 居住面积
输出:
大家庭个数
大家庭中id最小的人 人数 平均居住房子个数 平均居住面积
算法:
并查集可以用来统计大家庭个数,而且把id最小的作为父亲结点容易找到每个家庭的代表。
小家庭中每个人用vis[]来记录,若是出现了就是true,若没有就是false。
以set存每个小家庭在大家庭的代表,用来统计大家庭的个数。
以每个大家庭的代表为名建立三个unordered_map,分别统计每个大家庭的人数,住宅数目,住宅面积。
再将这三项和代表名字同意为一个结点,建立链表。再对链表排序。输出。
#include<stdio.h>
#include<algorithm>
#include<unordered_map>
#include<vector>
#include<set>
using namespace std;
const int maxn = 1010;
struct node{
int g;
int a;
};
struct answer{
int id;
int m;
double avg;
double ava;
};
int father[10010];
unordered_map<int,node> info;
unordered_map<int,int> member,estate,area;
unordered_map<int,bool> vis;
vector<answer> ans;
int N,M,A;
int findfather(int x)
{
int F;
if(x==father[x]) return x;
else
{
F = findfather(father[x]);
father[x] = F;
return F;
}
}
void Union(int a,int b)
{
int fa = findfather(a);
int fb = findfather(b);
if(fa<fb)
{
father[fb] = fa;
}else
{
father[fa] = fb;
}
}
bool cmp(answer a,answer b)
{
if(a.ava!=b.ava)
{
return a.ava>b.ava;
}else
{
return a.id<b.id;
}
}
int main()
{
for(int i=0;i<10010;i++)
{
father[i] = i;
}
scanf("%d",&N);
int u,v;
for(int i=0;i<N;i++)
{
scanf("%d",&u);
vis[u] = true;
for(int j=0;j<2;j++)
{
scanf("%d",&v);
if(v!=-1)
{
vis[v] = true;
Union(u,v);
}
}
int k;
scanf("%d",&k);
for(int j=0;j<k;j++)
{
scanf("%d",&v);
vis[v] = true;
Union(u,v);
}
scanf("%d%d",&M,&A);
info[u] = node{M,A};
}
set<int> family;
for(unordered_map<int,bool>::iterator it = vis.begin();it!=vis.end();it++)
{
family.insert(findfather(it->first));
member[findfather(it->first)]++;
}
for(unordered_map<int,node>::iterator it = info.begin();it!=info.end();it++)
{
estate[findfather(it->first)] += it->second.g;
area[findfather(it->first)] += it->second.a;
}
printf("%d\n",family.size());
for(set<int>::iterator it=family.begin();it!=family.end();it++)
{
int m;
double g,a;
m = member[*it];
g = (1.0*estate[*it])/m;
a = (1.0*area[*it])/m;
ans.push_back(answer{*it,m,g,a});
}
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<ans.size();i++)
{
printf("%04d %d %.3f %.3f\n",ans[i].id,ans[i].m,ans[i].avg,ans[i].ava);
}
return 0;
}