Propiedad familiar de la PTA (25 分)

Es la mente humana la que libera la luz infinita, y también es la mente humana la que crea la oscuridad ilimitada. La luz y la oscuridad se entrelazan y luchan juntas. Este es el mundo por el que estamos nostálgicos y desamparados.

Esta vez, se supone que debe ayudarnos a recopilar los datos de la propiedad familiar. Teniendo en cuenta los miembros de la familia de cada persona y la información estate) de la propiedad bajo su propio nombre, necesitamos saber el tamaño de cada familia, el área promedio y el número de conjuntos de su propiedad inmobiliaria.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea da un número entero positivo N (≤1000). Luego siguen N líneas, cada una da la información de una persona propietaria de bienes raíces en el formato:

ID Father Mother k Hijo 1 ⋯ Hijo k M patrimonio Area

donde  ID es un número de identificación único de 4 dígitos para cada persona; Father y  Mother son los  IDde los padres de esta persona (si uno de los padres falleció,  -1 se le dará en su lugar); k (0≤k≤5) es el número de hijos de esta persona; Los niños son los  IDde sus hijos; M estate es el número total de conjuntos de bienes inmuebles a su nombre; Area es el área total de su patrimonio.

Especificación de salida:

Para cada caso, primero escriba en una línea el número de familias (todas las personas que están relacionadas directa o indirectamente se consideran en la misma familia). Luego envíe la información de la familia en el formato:

ID M AVG establece el área de AVG

dónde  ID está la identificación más pequeña de la familia; M es el número total de miembros de la familia; Conjuntos de AVG es el número medio de conjuntos de su propiedad inmobiliaria; y el área AVG es el área promedio. Los números promedio deben tener una precisión de hasta 3 decimales. Las familias se deben dar en orden descendente de sus áreas promedio, y en orden ascendente de identificaciones si hay empate.

Entrada de muestra:

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

Salida de muestra:

3
8888 1 1.000 1000.000
0001 15 0.600 100.000
5551 4 0.750 100.000
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX
//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
typedef long long ll;
using namespace std;
int const mod=1e9+7;
const int maxn=10010;
struct DATA{
    int id, fid, mid, num, area;
    int cid[10];
}data[1010];
struct node {
    int id, pp;
    double num, area;
    bool fg=false;
}P[maxn];
int fa[maxn];
bool vis[maxn];
int fd(int x) {
    while(x!=fa[x])
        x=fa[x];
    return x;
}
void Union(int a, int b) {
    int faA=fd(a);
    int faB=fd(b);
    if(faA>faB)
        fa[faA]=faB;
    else if(faA<faB)
        fa[faB]=faA;
}
int cmp1(node a, node b) {
    if(a.area!=b.area)
        return a.area>b.area;
    else
        return a.id<b.id;
}
int main() {
    int n, k, ct=0;
    scanf("%d", &n);
    for(int i=0; i<maxn; i++)
        fa[i]=i;
    for(int i=0; i<n; i++) {
        scanf("%d %d %d %d", &data[i].id, &data[i].fid, &data[i].mid, &k);
        vis[data[i].id]=true;
        if(data[i].fid!=-1) {
            vis[data[i].fid]=true;
            Union(data[i].fid, data[i].id);
        }
        if(data[i].mid!=-1){
            vis[data[i].mid]=true;
            Union(data[i].mid, data[i].id);
        }
        for(int j=0; j<k; j++) {
            scanf("%d", &data[i].cid[j]);
            vis[data[i].cid[j]]=true;
            Union(data[i].cid[j], data[i].id);
        }
        scanf("%d %d", &data[i].num, &data[i].area);
    }
    for(int i=0; i<n; i++) {
        int id=fd(data[i].id);
        P[id].id=id;
        P[id].num+=data[i].num;
        P[id].area+=data[i].area;
        P[id].fg=true;
    }
    for(int i=0; i<maxn; i++) {
        if(vis[i])
            P[fd(i)].pp++;
        if(P[i].fg)
            ct++;
    }
    for(int i=0; i<maxn; i++) {
        if(P[i].fg){
            P[i].num=(double)(P[i].num*1.0/P[i].pp);
            P[i].area=(double)(P[i].area*1.0/P[i].pp);
        }
    }
    sort(P, P+maxn, cmp1);
    printf("%d\n", ct);
    for(int i=0; i<ct; i++)
        printf("%04d %d %.3f %.3f\n", P[i].id, P[i].pp, P[i].num, P[i].area);
    return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44170305/article/details/108511630
Recomendado
Clasificación