PAT Advanced Level 1114 Family Property
今天磕了蛮久才把这道题磕出来。。
这道题用并查集做就可以。传统的并查集是int father[]数组,这里我们找最小值。
所以合并的Union函数里不是直接father[fa]=fb,而是用father[max(fa,fb)]=min(fa,fb)。当然我们这里数组名不用father表示,我采用了minID作为数组名。
我的minID都初始化为-1,每次出现新的ID时,更新它的minID值为这个ID。最后遍历数组,不是-1的都是出现过的结点
需要注意的点和学到的东西:
①sort函数可以不用自己写比较函数,重载operator<即可。
②double类型不能用!=判断两个值是否相等,但用<和>是可以的。
③node结点里无需维护父子结点,如果在我的代码里加上这两样关系,会报内存超限的错误……
题目描述:
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.
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.
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.
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
#include
#include
#include
using namespace std;
const int maxn=10005;
int minID[maxn]; //存储每个node的最小ID 是并查集的集
struct Node{//每个node表示一个人
int M=0,area=0;
int ID;
}node[maxn];
struct family{
int ID; //表示家庭中最小的ID
int cnt=1; //表示家庭的人数
int area=0; //表示家庭总面积
int M=0; //表示家庭总房产个数
bool operator<(const family tmp)const{ //重载比较符号后可直接使用sort默认排序函数
double a=double(area)/cnt;
double b=double(tmp.area)/tmp.cnt;
if(a>b||ab;
return ID F;
for(int i=0;i