8.4
#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'); } }