天梯赛L2-007 家庭房产
作者:
蛙声一片
,
2024-04-16 21:59:19
,
所有人可见
,
阅读 11
天梯
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
const int N = 10010;
int p[N];//find
int ide[N],ss[N], house[N];//ide哈希,i->面积, i->房产
int anss[N],ansh[N];//id总面积房产
double as[N],ah[N];//id人均
int peo[N];//id家庭人数
int find(int x)
{
if(x != p[x])p[x] = find(p[x]);
return p[x];
}
void join(int a, int b)
{
int x=find(a),y=find(b);
if(x!=y)
{
if(x<y)p[y] = x,peo[x] += peo[y];
else p[x] = y, peo[y] += peo[x];
}
}
bool cmp(int a,int b)
{
if(as[a]==as[b])return a<b;
else return as[a]>as[b];
}
int main()
{ [ [ [](http://) ](http://) ](http://)
for(int i =0;i<N;i++)peo[i] = 1;
for(int i = 1;i<=N;i++)p[i]=i;
int n;cin>>n;
//join家庭联系
for(int i = 0;i<n;i++)
{
int id,fa,ma;cin>>id>>fa>>ma;
if(fa!=-1)join(fa,id);
if(ma!=-1)join(ma,id);
int k,t;cin>>k;
while(k--)
{
cin>>t;
if(t!=-1)join(t,id);
}
ide[i] = id;
cin>>house[i]>>ss[i];
}
// 将每个人的贡献加到id最小的代表上去
set<int>s;
int cnt = 0; //cnt计算家庭数
for(int i = 0;i<n;i++)
{
int id = find(ide[i]);
if(!s.count(id))
{
s.insert(id);
cnt++;
}
anss[id] += ss[i];
ansh[id] += house[i];
}
cout<<cnt<<endl;
//按要求排序
vector<int>v;
for(auto id : s)
{
v.push_back(id);
as[id] = 1.0*anss[id]/peo[id];
ah[id] = 1.0*ansh[id]/peo[id];
}
sort(v.begin(),v.end(),cmp);
for(auto id :v)
{
printf("%04d %d %.3f %.3f\n", id, peo[id], ah[id],as[id]);
}
return 0;
}