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;
}
posted @ 2021-11-24 21:02  kingwzun  阅读(77)  评论(0编辑  收藏  举报