您的位置:首页 > 运维架构

1114. Family Property

2016-09-16 20:17 316 查看


1114. Family Property (25)

时间限制

150 ms

内存限制

65536 kB

代码长度限制

16000 B

判题程序

Standard

作者

CHEN, Yue

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 M_estate 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;M_estate 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 AVG_sets AVG_area

where ID is the smallest ID in the family; M is the total number of family members; AVG_sets is the average number of sets of their real estate; and AVG_area 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

这题也是并查集,参数好多啊,父母和子女可以合并成一个,用了set存他们的id,而没有用数组去存他们的根节点。

#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>

using namespace std;

typedef struct node
{
double me;
double e;
int root;
set<int>c;
int id;
double avgs;
double avga;
};

node p[10000];

bool cmp(node x,node y)
{
if(x.avga!=y.avga)
return x.avga>y.avga;
else
return x.id<y.id;

}

int findroot(int num)
{
if(p[num].root==-1)
return num;
int r=findroot(p[num].root);
p[num].root=r;
return r;
}

int main()
{
for(int i=0;i<10000;i++)
p[i].root=-1;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int id;
cin>
a4ac
;>id;
p[id].c.insert(id);
for(int j=0;j<2;j++)
{
int pa;
cin>>pa;
if(pa!=-1)
{
p[id].c.insert(pa);
}
}
int cn;
cin>>cn;
for(int j=0;j<cn;j++)
{
int cid;
cin>>cid;
p[id].c.insert(cid);
}
cin>>p[id].me>>p[id].e;
}
for(int i=0;i<10000;i++)
{
if(p[i].c.empty())
continue;
int r1=findroot(i);
{
for(auto str=p[i].c.begin();str!=p[i].c.end();str++)
{
int r2=findroot(*str);
if(r1!=r2)
{
p[r2].root=r1;
p[r1].c.insert(r2);
p[r1].c.insert(p[r2].c.begin(),p[r2].c.end());
p[r1].me+=p[r2].me;
p[r1].e+=p[r2].e;
}
}
}
}
vector<node> ans;
for(int i=0;i<10000;i++)
{
if(p[i].c.empty())
continue;
if(p[i].root==-1)
ans.push_back(p[i]);
}

cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++)
{
ans[i].id=*ans[i].c.begin();
ans[i].avgs=ans[i].me/ans[i].c.size();
ans[i].avga=ans[i].e/ans[i].c.size();
}
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<ans.size();i++)
{
printf("%04d %d %.3lf %.3lf\n",ans[i].id,ans[i].c.size(),ans[i].avgs,ans[i].avga);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT C++