8.4

发布时间 2023-08-05 17:15:21作者: 徐星凯
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    //自己父母和孩子的编号
    int master;
    int fa;
    int mu;
    int kidn;
    int kids[10];
    double sum,area;
}node;
node a[10005];//输入行的结构体
typedef struct node1{
    int people;
    int id,flag;
    double sum,area;
}node1;
node1 b[10005];//家庭的结构体
typedef struct node2{
    int people;
    int id;
    double sum,area; 
}node2;
node2 c[1005];
int n;
int cnt=0;
int visit[10005]={0};
int home[10005];
int find(int x);
void un(int a,int b);

int main()
{
    for(int i=0;i<10005;i++){   //初始化
        home[i]=i;
        b[i].flag=0;    //该题所需,并非并查集的要求
    }
    //输入数据
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d %d %d %d",&a[i].master,&a[i].fa,&a[i].mu,&a[i].kidn);
        visit[a[i].master]=1;
        //判断是否有人去世
        if(a[i].fa!=-1){
            un(a[i].master,a[i].fa);
            visit[a[i].fa]=1;
        }
        if(a[i].mu!=-1){
            un(a[i].master,a[i].mu);
            visit[a[i].mu]=1;
        }
        for(int j=0;j<a[i].kidn;j++){
            scanf("%d",&a[i].kids[j]);
            un(a[i].master,a[i].kids[j]);
            visit[a[i].kids[j]]=1;
        }
        scanf("%lf %lf",&a[i].sum,&a[i].area);
    }
    //判断是否有人同时出现在几个输入行中
    for(int i=0;i<n;i++){
        //求房产总数和面积总数
        int id=find(a[i].master);
        b[id].id=id;
        b[id].sum+=a[i].sum;
        b[id].area+=a[i].area;
        b[id].flag=1;
    }
    for(int i=0;i<10005;i++){
        if(visit!=0){
            b[find(i)].people+=1;
        }
    }
    //求人均房产套数,面积
    for(int i=0;i<10005;i++){
        if(b[i].flag){
            b[i].sum=b[i].sum/b[i].people;
            b[i].area=b[i].area/b[i].people;
        }
    }
    for(int i=0;i<10005;i++){
        if(b[i].flag){
            c[cnt].id=b[i].id;
            c[cnt].area=b[i].area;
            c[cnt].people=b[i].people;
            c[cnt].sum=b[i].sum;
            cnt++;    
        }
    }
    node2 t;
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(c[i].area<c[j].area){
                t=c[i];
                c[i]=c[j];
                c[j]=t;
            }else{
                if(c[i].area==c[j].area){
                    if(c[j].id<c[i].id){
                        t=c[i];
                        c[i]=c[j];
                        c[j]=t;
                    }
                }
            }
        }
    }
    printf("%d\n",cnt);
    for(int i=0;i<cnt;i++){
        printf("%04d %d %.3lf %.3lf\n",c[i].id,c[i].people,c[i].sum,c[i].area);
    }
    return 0;
}
int find(int x){
    while(x!=home[x]){
        x=home[x];
    }
    return x;
}
void un(int a,int b){
    int f11=find(a);
    int f22=find(b);
    if(f11>f22){
        home[f11]=f22;
    }else{
        home[f22]=f11;
    }
}
#include<iostream>
#include<queue>
using namespace std;
const int maxn=35;
int post[maxn],mid[maxn],pos[maxn],n,p;
struct N{int data;N *l,*r;};
//对二叉树进行遍历
void creat(int l,int r,N* &fa){
    for(int i=l;i<=r;i++)   if(mid[i]==post[p]){fa=new N{post[p--]};break;}
    if(fa)  creat(pos[fa->data]+1,r,fa->r),creat(l,pos[fa->data]-1,fa->l);
}

int main(){
    cin>>n,p=n;
    //后序和中序遍历
    for(int i=1;i<=n;i++)   cin>>post[i];
    for(int i=1;i<=n;i++)   cin>>mid[i],pos[mid[i]]=i;
    N *root;
    creat(1,n,root);
    queue<N> que;   que.push(*root);
    while(que.size()){
        N t=que.front();que.pop();
        if(t.l) que.push(*t.l),delete t.l;
        if(t.r) que.push(*t.r),delete t.r;
        //输出层序遍历的序列
        cout<<t.data<<(que.size()?' ':'\n');
    }
}