zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
    
  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/weedboy/p/7351124.html
Copyright © 2011-2022 走看看