时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数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<algorithm>
#include<stdio.h>
#include<string.h>
#define maxx 10005
using namespace std;
struct node1
{
int id;
int root;
int sqr;
};
node1 num[maxx];
struct node
{
int id;//本人编号
int num;//人数
int root;//房子数量
int sqr;//面积
double roott;//人均套数
double sqrr;//人均面积
};
node vis[maxx];
int pre[maxx];
int viss[maxx];
bool cmp(const node &a,const node &b)
{
if(a.sqrr==b.sqrr)
return a.id<b.id;
return a.sqrr/b.sqrr>=1.0;
}
void init()
{
for(int i=0;i<maxx;i++)
{
pre[i]=i;
vis[i].id=0;
vis[i].num=0;
vis[i].root=0;
vis[i].sqr=0;
vis[i].roott=0;
vis[i].sqrr=0;
}
}
int findd(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r];
int i=x,j;
while(i!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void unite(int a,int b)
{
a=findd(a);
b=findd(b);
if(a!=b)
pre[b]=a;
}
int main()
{
memset(viss,0,sizeof(viss));
int t;
scanf("%d",&t);
init();
for(int i=0;i<t;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
viss[a]=1;
if(b!=-1)
{
unite(a,b);
viss[b]=1;
}
if(c!=-1)
{
unite(a,c);
viss[c]=1;
}
int k,s;
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d",&s);
unite(a,s);
viss[s]=1;
}
num[i].id=a;
scanf("%d%d",&num[i].root,&num[i].sqr);
}
for(int i=0;i<t;i++)
{
int idd=num[i].id;
idd=findd(idd);
vis[idd].root+=num[i].root;
vis[idd].sqr+=num[i].sqr;
}
for(int i=0;i<maxx;i++)
{
if(viss[i])
{
pre[i]=findd(i);
if(vis[pre[i]].num==0)
{
vis[pre[i]].id=i;
}
vis[pre[i]].num++;
vis[pre[i]].roott=vis[pre[i]].root*1.0/vis[pre[i]].num;
vis[pre[i]].sqrr=vis[pre[i]].sqr*1.0/vis[pre[i]].num;
}
}
sort(vis,vis+maxx,cmp);
int ans=0;
for(int i=0;i<maxx;i++)
{
if(vis[i].num)
ans++;
else
break;
}
printf("%d\n",ans);
for(int i=0;i<ans;i++)
{
printf("%04d %d %.3lf %.3lf\n",vis[i].id,vis[i].num,vis[i].roott,vis[i].sqrr);
}
return 0;
}