题目描述
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一个人的房产:
编号 父 母 k 孩子1 … 孩子k 房产套数 总面积
其中编号是每个人独有的一个4位数的编号;父和母分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0≤k≤5)是该人的子女的个数;孩子i是其子女的编号。
输出格式:
首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:
家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。
输入样例:
10
6666 5551 5552 1 7777 1 100
1234 5678 9012 1 0002 2 300
8888 -1 -1 0 1 1000
2468 0001 0004 1 2222 1 500
7777 6666 -1 0 2 300
3721 -1 -1 1 2333 2 150
9012 -1 -1 3 1236 1235 1234 1 100
1235 5678 9012 0 1 50
2222 1236 2468 2 6661 6662 1 300
2333 -1 3721 3 6661 6662 6663 1 100
输出样例:
3
8888 1 1.000 1000.000
0001 15 0.600 100.000
5551 4 0.750 100.000
虽然过了,但感觉还是有许多细节没处理好,若有见解,欢迎指点哈!
#include<stdio.h>
#include<string.h>
int a[1010][100],n;
void putfun(int a[][2],double b[][2],int m,int j)//每次只输出最大的数,毁掉原来最大数
{
int i,t;
for(i=1;i<m;i++)
{
if(b[i][1]>b[j][1]&&b[i][1]!=-1)j=i;
else if(b[i][1]==b[j][1]&&a[i][1]>a[j][1])j=i;//特殊情况处理
}
printf("%04d %d %.3lf %.3lf\n",a[j][0],a[j][1],b[j][0],b[j][1]);
b[j][1]=-1;
}
int rfun(int a[],int s)//求出家庭的人数
{
int i,j,k;
for(i=0;i<s;i++)
for(j=i+1;j<s;j++)
if(a[j]==a[i])
{
for(k=j+1;k<s;k++)a[k-1]=a[k];
s--;
}
return s;
}
void pfun(int num,int k)//递归求出几个家族
{
int i,j,x;
for(i=0;i<n;i++)
for(j=2;j<a[i][1]-2;j++)
if(a[i][j]==num&&j!=5&&a[i][j]!=-1&&a[i][0]==0)
{
a[i][0]=k;
for(x=2;x<a[i][1]-2;x++)
if(x!=5&&a[i][x]!=-1)pfun(a[i][x],k);
}
}
int main()
{
int i,j,count,k=0,min=10000,s,sumF,sumS;
int rnum[1010],ren[1010][2];
double ave[1010][2];
scanf("%d",&n);
for(i=0;i<n;i++)
{
j=0;
a[i][0]=0;
scanf("%d %d %d",&a[i][2],&a[i][3],&a[i][4]);
scanf("%d",&a[i][5]); //儿子的个数
j=6;
count=a[i][5];
while(count)
{
scanf("%d",&a[i][j++]);
count--;
}
scanf("%d %d",&a[i][j],&a[i][j+1]);
a[i][1]=j+2;
}
k=0;//家族数目K
for(i=0;i<n;i++)if(a[i][0]==0){k++;pfun(a[i][2],k);}
printf("%d\n",k);
for(count=1;count<=k;count++)
{
min=10000;
memset(rnum,0,sizeof(rnum));
sumF=sumS=s=0;
for(i=0;i<n;i++)
{
if(a[i][0]==count)
{
for(j=2;j<a[i][1]-2;j++)
if(j!=5&&a[i][j]!=-1)
{
if(a[i][j]<min)min=a[i][j];
rnum[s++]=a[i][j];
}
sumF+=a[i][a[i][1]-2];
sumS+=a[i][a[i][1]-1];
}
}
ren[count][0]=min; //家庭成员的最小编号
ren[count][1]=rfun(rnum,s); //家庭人口数
ave[count][0]=sumF*1.0/ren[count][1];//人均房产套数
ave[count][1]=sumS*1.0/ren[count][1];//人均房产面积
}
for(i=1;i<=k;i++)putfun(ren,ave,count,i);
return 0;
}