L2-007 家庭房产 (25 分)


 

#include 
#include 
using namespace std;
const int N = 10010;
struct Peo {
    double housenum, area;
}people[N];
struct Fam {
    int id, num;
    double totalhousenum, totalarea;
}family[N];
int f[N];
bool vispeople[N], visfamily[N];
int n;

int find(int x) {
    if(x != f[x]) f[x] = find(f[x]);
    return f[x];
}
void merge(int a, int b) {
    a = find(a), b = find(b);
    if(a != b) f[b] = a;
}

bool cmp(Fam a, Fam b) {
    if(a.num*b.totalarea != a.totalarea*b.num) return a.totalarea*b.num > b.totalarea*a.num;
    else return a.id < b.id;
}
int main() {
    cin >> n;
    for(int i = 0; i < N; i++) f[i] = i;
    while(n--) {
        int iid, fa, ma, k;
        cin >> iid >> fa >> ma;
        vispeople[iid] = 1;
        if(fa != -1) {
            vispeople[fa] = 1;
            merge(iid, fa);
        }
        if(ma != -1) {
            vispeople[ma] = 1;
            merge(iid, ma);
        }
        cin >> k;
        for(int j = 0; j < k; j++) {
            int c; cin >> c;
            vispeople[c] = 1;
            merge(iid, c);
        }
        cin >> people[iid].housenum >> people[iid].area;
    }
    int cnt = 0;
    for(int i = 0; i < N; i++) {
        if(vispeople[i]) {
            int x = find(i);
            if(visfamily[x]) {
                for(int j = 0; j < cnt; j++) {
                    if(find(family[j].id) == x) {
                        family[j].num++;
                        family[j].totalhousenum += people[i].housenum;
                        family[j].totalarea += people[i].area;
                        break;
                    }
                }
            } else {
                visfamily[x] = 1;
                family[cnt].id = i;
                family[cnt].totalhousenum = people[i].housenum;
                family[cnt].totalarea = people[i].area;
                family[cnt].num = 1;
                cnt++;
            }
        }
    }
    
    sort(family, family+cnt, cmp);
    cout << cnt << endl;
    for(int i = 0; i < cnt; i++) {
        printf("%.04d %d %.3f %.3f\n", family[i].id, family[i].num, 1.0*family[i].totalhousenum / family[i].num, 1.0*family[i].totalarea / family[i].num);
    }
    return 0;
}

相关