题意:

输入一个正整数N(<=10000),接着输入N行每行包括一个人的ID和他双亲的ID以及他的孩子数量和孩子们的ID(四位整数包含前导零),还有他所拥有的房产数量和房产面积。输出一共有多少个块(所有有父子关系的点都视为处于同一块),以及每块的元素个数以及平均每人分得的房产数量和房产面积(保留三位小数),输出顺序按照房产面积降序,第二优先以ID升序。

AAAAAccepted code:

 #define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
int ba[];
int per[];
int sets[],area[];
int num[];
int child[];
int find_(int x){
if(ba[x]==x)
return x; return ba[x]=find_(ba[x]);
};
typedef struct{
int id,num;
double avgsets,avgarea;
}st;
st ans[];
int vis[];
int flag[];
bool cmp(st a,st b){
if(a.avgarea!=b.avgarea)
return a.avgarea>b.avgarea;
return a.id<b.id;
}
int main(){
//ios::sync_with_stdio(false);
//cin.tie(NULL);
//cout.tie(NULL);
for(int i=;i<;++i)
ba[i]=i,num[i]=;
int n;
scanf("%d",&n);
for(int i=;i<=n;++i){
memset(flag,,sizeof(flag));
int id;
scanf("%d",&id);
int x=,y=,z=;
x=find_(id);
int fa,mo;
scanf("%d%d",&fa,&mo);
if(fa!=-)
y=find_(fa);
if(mo!=-)
z=find_(mo);
int root=min(x,y);
root=min(root,z);
int k;
scanf("%d",&k);
int mn=;
for(int j=;j<=k;++j){
scanf("%d",&child[j]);
mn=min(mn,find_(child[j]));
vis[child[j]]=;
}
int tsets,tarea;
scanf("%d%d",&tsets,&tarea);
sets[x]+=tsets;
area[x]+=tarea;
if(mn<root)
root=mn;
if(x!=root)
flag[x]=,num[root]+=num[x],sets[root]+=sets[x],area[root]+=area[x];
if(y!=root&&y!=&&!flag[y])
flag[y]=,num[root]+=num[y],sets[root]+=sets[y],area[root]+=area[y];
if(z!=root&&z!=&&!flag[z])
flag[z]=,num[root]+=num[z],sets[root]+=sets[z],area[root]+=area[z];
ba[x]=root;
if(y<)
ba[y]=root;
if(z<)
ba[z]=root;
for(int j=;j<=k;++j){
int temp=find_(child[j]);
ba[temp]=root;
if(temp!=root&&!flag[temp]){
flag[temp]=;
num[root]+=num[temp];
sets[root]+=sets[temp];
area[root]+=area[temp];
}
}
vis[id]=;
if(fa!=-)
vis[fa]=;
if(mo!=-)
vis[mo]=;
}
int cnt=;
for(int i=;i<;++i){
if(ba[i]==i&&vis[i]){
ans[++cnt].id=i;
ans[cnt].num=num[i];
ans[cnt].avgsets=1.0*sets[i]/num[i];
ans[cnt].avgarea=1.0*area[i]/num[i];
}
}
sort(ans+,ans++cnt,cmp);
printf("%d\n",cnt);
for(int i=;i<=cnt;++i){
printf("%04d %d %.3lf %.3lf",ans[i].id,ans[i].num,ans[i].avgsets,ans[i].avgarea);
if(i<cnt)
printf("\n");
}
return ;
}

【PAT甲级】1114 Family Property (25分)(并查集)的更多相关文章

  1. PAT甲题题解-1114. Family Property (25)-(并查集模板题)

    题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数.人均房产个数和人均房产面积.第一行输出家庭个数,随后每行输出家庭成员的最小编号.家庭人口数.人均房产个数.人均房 ...

  2. PAT甲级1114. Family Property

    PAT甲级1114. Family Property 题意: 这一次,你应该帮我们收集家族财产的数据.鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的 ...

  3. PAT甲级——1114 Family Property (并查集)

    此文章同步发布在我的CSDN上https://blog.csdn.net/weixin_44385565/article/details/89930332 1114 Family Property ( ...

  4. PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习

    1020 Tree Traversals (25分)   Suppose that all the keys in a binary tree are distinct positive intege ...

  5. PAT 甲级 1146 Topological Order (25 分)(拓扑较简单,保存入度数和出度的节点即可)

    1146 Topological Order (25 分)   This is a problem given in the Graduate Entrance Exam in 2018: Which ...

  6. PAT 甲级 1071 Speech Patterns (25 分)(map)

    1071 Speech Patterns (25 分)   People often have a preference among synonyms of the same word. For ex ...

  7. PAT 甲级 1063 Set Similarity (25 分) (新学,set的使用,printf 输出%,要%%)

    1063 Set Similarity (25 分)   Given two sets of integers, the similarity of the sets is defined to be ...

  8. PAT 甲级 1059 Prime Factors (25 分) ((新学)快速质因数分解,注意1=1)

    1059 Prime Factors (25 分)   Given any positive integer N, you are supposed to find all of its prime ...

  9. PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)

    1051 Pop Sequence (25 分)   Given a stack which can keep M numbers at most. Push N numbers in the ord ...

  10. PAT 甲级 1048 Find Coins (25 分)(较简单,开个数组记录一下即可)

    1048 Find Coins (25 分)   Eva loves to collect coins from all over the universe, including some other ...

随机推荐

  1. scrapy框架综合运用 爬取天气预报 + 定时任务

    爬取目标网站: http://www.weather.com.cn/ 具体区域天气地址: http://www.weather.com.cn/weather1d/101280601.shtm(深圳) ...

  2. [Python]爬取首都之窗百姓信件网址id python 2020.2.13

    经人提醒忘记发网址id的爬取过程了, http://www.beijing.gov.cn/hudong/hdjl/com.web.consult.consultDetail.flow?original ...

  3. Project Euler 133: Repunit nonfactors

    题意 英文 做法 结论1:\(R(a)|R(am)(a,m\ge 1)\) \[\frac{R(am)}{R(a)}=\frac{\frac{10^{am}-1}{9}}{R(a)}=\frac{\f ...

  4. React Hooks 笔记1

    useState const [state, setSate] = useState(initialState) 特征: setState 标识稳定,组件重新渲染时不会变化,useState 返回的第 ...

  5. C语言面试题 02.03. 删除中间节点

    实现一种算法,删除单向链表中间的某个节点(除了第一个和最后一个节点,不一定是中间节点),假定你只能访问该节点. 示例: 输入:单向链表a->b->c->d->e->f中的 ...

  6. paramiko 基于密钥文件登陆

    首先密钥登陆远程的原理 client 端 将公钥放在远程机器authorized_keys: 使用 ssh-copy-id  app@ip 接着在client机器生成密钥 使用ssh-keygen - ...

  7. H5_0010:JS动态创建CSS,并向CSS中传入参数值

    1,在html中定义style 2,js中创建css,并添加进入head标签style中 !function(e, t, i) { n.classList && n.classList ...

  8. 爬格子呀--IEEE极限编程大赛留念

    10.14,坐标:电子科技大学 24h,不间断的编程,感觉还是很爽的. 排名一般,但是这是开始,未来还很远. 题目举例1: 广袤的非洲大草原上,狮子居住在一个个的网格里,他们的势力范围会以曼哈顿路程的 ...

  9. 在Scala中免费验证

    优锐课带你详细了解如何在Scala中实施免费的monad验证.抽丝剥茧,细说架构那些事! 由于业务数据的复杂性,已经在数据验证上花费了很多精力.在Scala中,提出了使用应用程序进行验证的方法,并被广 ...

  10. java打印出某一指定路径下的文件夹内的所有子文件夹和文件,并区分开来

    public class printoutFile { public static void main(String[] args) { printFile(new File("D:\\te ...