1. 程式人生 > 其它 >L2-007 家庭房產 (25 分)

L2-007 家庭房產 (25 分)

#include <iostream>
#include <algorithm>
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; }
不要羨慕別人喝的飲料有各種顏色,其實未必有你的白開水解渴,