• PAT甲级1114. Family Property


    PAT甲级1114. Family Property

    题意:

    这一次,你应该帮我们收集家族财产的数据。鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的房地产的平均面积和数量。

    输入规格:

    每个输入文件包含一个测试用例。对于每种情况,
    第一行给出正整数N(<= 1000)。然后N行跟随,每个给出一个拥有庄园的人的信息,格式如下:

    ID父亲母亲k Child1 ... Childk M_estate Area

    其中ID是每个人唯一的4位数识别号码;父亲和母亲是这个人的父母的身份证件(如果父母已经去世了,
    -1将被赋予); k(0 <= k <= 5)是这个人的子女人数;孩子是他/她的孩子的身份证; M_estate是他/她名下的房地产总数;而区域是他/她的遗产的总面积。

    输出规格:

    对于每种情况,
    首先打印出一系列家庭(直接或间接相关的所有人在同一个家庭中被考虑)。然后以以下格式输出家庭信息:

    ID M AVG_sets AVG_area

    其中ID是家庭中最小的ID; M是家庭成员的总数; AVG_sets是其房地产的平均数量;
    AVG_area是平均区域。平均数字必须精确至3位小数。这些家庭必须按其平均面积的降序排列,如果有领带,则按ID的升序排列。

    思路:

    并查集。数据太多有点乱。

    ac代码:

    C++

    // pat1114.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<cstring>
    #include<stdio.h>
    #include<map>
    #include<cmath>
    #include<unordered_map>
    #include<unordered_set>
    
    using namespace std;
    
    const int maxn = 1e5 + 5;
    int vis[maxn];
    
    struct UF
    {
    	int pre[maxn];
    	void init()
    	{
    		for (int i = 0; i < maxn; i++)
    			pre[i] = i;
    	}
    
    	int find(int x)
    	{
    		return pre[x] == x ? x : find(pre[x]);
    	}
    
    	void Union(int a, int b)
    	{
    		int x = find(a);
    		int y = find(b);
    		if (x == y) return;
    		pre[max(x, y)] = min(x, y);
    	}
    }uf;
    
    struct Person
    {
    	int id = -1;
    	int dad, mom;
    	int k;
    	int child[5];
    	int estate;
    	int area;
    }person[maxn];
    
    struct Family
    {
    	int minid;
    	int member_cnt = 0;  
    	int all_estate = 0; 
    	int all_area = 0;  
    	float avg_estate;  
    	float avg_area;  
    	bool operator<(const Family tmp)const {
    		if (avg_area == tmp.avg_area) {
    			return minid < tmp.minid;
    		}
    		else {
    			return avg_area > tmp.avg_area;
    		}
    	}
    }family[maxn];
    
    int main()
    {
    	int n, id;
    	scanf("%d", &n);
    	uf.init();
    	memset(vis, 0, sizeof(vis));
    	for (int i = 0; i < n; i++)
    	{
    		scanf("%d", &id);
    		person[id].id = id;
    		scanf("%d %d %d", &person[id].dad, &person[id].mom, &person[id].k);
    		vis[id] = 1;
    		if (person[id].dad != -1)
    		{
    			uf.Union(id, person[id].dad);
    			vis[person[id].dad] = 1;
    		}
    		if (person[id].mom != -1)
    		{
    			uf.Union(id, person[id].mom);
    			vis[person[id].mom] = 1;
    		}
    		for (int j = 0; j < person[id].k; j++)
    		{
    			scanf("%d", &person[id].child[j]);
    			uf.Union(id, person[id].child[j]);
    			vis[person[id].child[j]] = 1;
    		}
    		scanf("%d %d", &person[id].estate, &person[id].area);
    	}
    
    	int idArray[maxn];
    	int cnt = 0;
    	for (int i = 0; i < maxn; i++)
    	{
    		if (vis[i] == 1)
    		{
    			idArray[cnt++] = i;
    		}
    	}
    	memset(vis, 0, sizeof(vis));
    	int u, fa;
    	for (int i = 0; i < cnt; i++)
    	{
    		u = idArray[i];
    		fa = uf.find(u);
    		vis[fa] = 1;
    		family[fa].minid = fa;
    		family[fa].member_cnt++;
    		family[fa].all_estate += person[u].estate;
    		family[fa].all_area += person[u].area;
    	}
    
    	int family_num = 0;
    	for (int i = 0; i < maxn; i++)
    	{
    		if (vis[i] == 1)
    		{
    			family_num++;
    			family[i].avg_area = (float)family[i].all_area / family[i].member_cnt;
    			family[i].avg_estate = (float)family[i].all_estate / family[i].member_cnt;
    		}
    	}
    	sort(family, family + maxn);
    
    	printf("%d
    ", family_num);
    	for (int i = 0; i < family_num; i++)
    	{
    		printf("%04d %d %.3f %.3f
    ", family[i].minid, family[i].member_cnt, family[i].avg_estate,
    			family[i].avg_area);
    	}
        return 0;
    }
    
    
    
  • 相关阅读:
    生成建表脚本(V2.0)
    QQ抢车位游戏PhysicalDataModel
    自定义工资公式设计
    .NET开发人员必知的八个网站
    MongoDB 学习 error以及解决方法
    lm_sensors 查看硬件信息
    setuid on shell scripts
    SSD寿命状态检测
    SysBench安装使用。
    用rsync对网站进行镜像备份(不靠谱)
  • 原文地址:https://www.cnblogs.com/weedboy/p/7351124.html
Copyright © 2020-2023  润新知