7-6 家庭房产 (25 分)
题目
题目不难, 就是麻烦点
代码
#include <bits/stdc++.h>
using namespace std;
struct node//输入结点
{
int id,fid,mid;
int c[6];
int anum;
int area;
}v[10010];
struct Ans//答案
{
int id;
int people=0;
double anum,area;
bool flag;
}ans[10010];
int father[10010];
bool vis[10010]={
false};
int findfather(int x)//并查集组成
{
if(father[x]!=x)
father[x]=findfather(father[x]);
return father[x];
}
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(Ans a,Ans b)//排序规则
{
if(a.area==b.area)
return a.id<b.id;
else
return a.area>b.area;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<10010;i++) father[i]=i;
// int id,fid,mid,k,child,num,area;
for(int i=0;i<n;i++){
cin>>v[i].id>>v[i].fid>>v[i].mid;
vis[v[i].id]=1;
if(v[i].fid!=-1){//处理父亲
Union(v[i].id,v[i].fid);
vis[v[i].fid]=1;
}
if(v[i].mid!=-1){//处理母亲
Union(v[i].id,v[i].mid);
vis[v[i].mid]=1;
}
int k; cin>>k;
for(int j=0;j<k;j++){
cin>>v[i].c[j];
if(v[i].c[j]!=-1){
Union(v[i].id,v[i].c[j]);//处理儿子
vis[v[i].c[j]]=true;
}
}
cin>>v[i].anum>>v[i].area;//输出房产,空间
}
for(int i=0;i<n;i++){
int id=findfather(v[i].id);//找到祖宗
ans[id].id=id;
ans[id].area+=v[i].area;//先算出总面积
ans[id].anum+=v[i].anum;//先算出总房产
ans[id].flag=true;
}
int out=0;//代表一共有多少大家庭
for(int i=0;i<10000;i++){
if(vis[i]){//确认大家庭的人员总数
ans[findfather(i)].people++;
}
if(ans[i].flag) //意味着该点是大家庭祖宗
{
out++;//确认有多少大家庭
}
}
//*********************不能与上面out++合并,原因未知**************************
for(int i=0;i<10000;i++){
if(ans[i].flag)
{
ans[i].anum=(double)(ans[i].anum*1.0/ans[i].people); //算平均
ans[i].area=(double)(ans[i].area*1.0/ans[i].people); //算平均
}
}
sort(ans,ans+10000,cmp);//排序
cout<<out<<endl;
for(int i=0;i<out;i++)
{
printf("%04d %d %.3f %.3f\n",ans[i].id,ans[i].people,ans[i].anum,ans[i].area);
//注意输出格式
}
return 0;
}