文章目录
Author: CHEN, Yue
Organization: 浙江大学
Time Limit: 200 ms
Memory Limit: 64 MB
Code Size Limit: 16 KB
A1114 Family Property (25 point(s))
This time, you are supposed to help us collect the data for family-owned property. Given each person’s family members, and the estate(房产)info under his/her own name, we need to know the size of each family, and the average area and number of sets of their real estate.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤1000). Then N lines follow, each gives the infomation of a person who owns estate in the format:
ID Father Mother k Child1 ⋯Childk Mestate Area
where ID is a unique 4-digit identification number for each person; Father and Mother are the ID’s of this person’s parents (if a parent has passed away, -1 will be given instead); k (0≤k≤5) is the number of children of this person; Childi 's are the ID’s of his/her children; Mestate is the total number of sets of the real estate under his/her name; and Area is the total area of his/her estate.
Output Specification:
For each case, first print in a line the number of families (all the people that are related directly or indirectly are considered in the same family). Then output the family info in the format:
ID M AVGsets AVGarea
where ID is the smallest ID in the family; M is the total number of family members; AVGsets
is the average number of sets of their real estate; and AVGarea is the average area. The average numbers must be accurate up to 3 decimal places. The families must be given in descending order of their average areas, and in ascending order of the ID’s if there is a tie.
Sample Input:
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
Sample Output:
3
8888 1 1.000 1000.000
0001 15 0.600 100.000
5551 4 0.750 100.000
Code
#include <stdio.h>
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
struct NODE{
int id;
double aveares,aveestate;
};
bool cmp(NODE a,NODE b){
if(a.aveares==b.aveares) return a.id<b.id;
else return a.aveares>b.aveares;
}
map<int, int> estate,are;
int father[10000],cluCnt[10000],appear[10000];
vector<int> root,familymenber[10000];
vector<NODE> res;
int findFather(int x){
if(x==father[x]) return x;
else{
int F=findFather(father[x]);
father[x]=F;
return F;
}
}
void Union(int a,int b){
int faA=findFather(a),faB=findFather(b);
if(faA!=faB) father[faA]=faB;
}
int main(){
int n,id,fa,mo,k,child,mestate,area;
scanf("%d",&n);
for(int i=0;i<10000;i++) father[i]=i;
for(int i=0;i<n;i++){
scanf("%d %d %d %d",&id,&fa,&mo,&k);
appear[id]=1;
if(mo!=-1){
Union(id,mo);
appear[mo]=1;
}
if(fa!=-1){
Union(id,fa);
appear[fa]=1;
}
for(int j=0;j<k;j++){
scanf("%d",&child);
Union(child,id);
appear[child]=1;
}
scanf("%d %d",&mestate,&area);
estate[id]=mestate;
are[id]=area;
}
for(int i=0;i<10000;i++){
if(appear[findFather(i)]==1){
cluCnt[findFather(i)]++; //对一个集合中的元素计数,存在编号根节点编号的位置
familymenber[findFather(i)].push_back(i); //将一个集合的元素存在一起(为了取编号最小)
}
}
for(int i=0;i<10000;i++){
if(cluCnt[i]>0){
root.push_back(i);
}
}
for(int i=0;i<root.size();i++){
sort(familymenber[root[i]].begin(),familymenber[root[i]].end());
NODE temp;
temp.id=familymenber[root[i]][0];
temp.aveares=0;
temp.aveestate=0;
for(int j=0;j<10000;j++){
if(findFather(j)==root[i]){
temp.aveestate+=estate[j];
temp.aveares+=are[j];
}
}
temp.aveares=(double)temp.aveares/cluCnt[root[i]];
temp.aveestate=(double)temp.aveestate/cluCnt[root[i]];
res.push_back(temp);
}
sort(res.begin(),res.end(),cmp);
printf("%d\n",root.size());
for(int i=0;i<res.size();i++){
printf("%.4d %d %.3f %.3f\n",res[i].id,cluCnt[findFather(res[i].id)],res[i].aveestate,res[i].aveares);
}
return 0;
}
Analysis
-已知每个家庭的父母,孩子,其自己名下的房产数和名下房产面积。
-求每个家庭的中最小ID号以及人口数,人均房产面积和房产套数。