L2-007 家庭房产 (25 分)

这两天要是debug不出来就重写(笑

感觉用并查集然后合并的时候维护会好写一点,代码80行左右可以参考下思路

挖坑,监督自己填上

upd : 已A : (重写yyds

#include <bits/stdc++.h>
using namespace std;

const int N = 10010;
int pa[N], peo[N], mn[N];
double house[N], area[N];

int Find(int x) {
    
    
	return pa[x] == x ? x : pa[x] = Find(pa[x]);
} 

struct node {
    
    
	int mn, peo;
	double house, area;
	bool operator< (const node& obj) const {
    
    
		if(fabs(area / (double)peo - obj.area / (double)obj.peo) < 1e-8) return mn < obj.mn;
		return area / (double)peo > obj.area / (double)obj.peo;
	}
};

vector<node> ans;
set<int> st;

void Union(int x, int y) {
    
    
	int pax = Find(x), pay = Find(y);
	if(pax == pay) return;
	mn[pay] = min(mn[pay], mn[pax]);
	house[pay] += house[pax];
	peo[pay] += peo[pax];
	area[pay] += area[pax];
	pa[pax] = pay;	
	return;
}

int main() {
    
    
	for(int i = 0; i < 10000; ++ i) {
    
    
		pa[i] = i; peo[i] = 1; mn[i] = i;
	}
	int n;
	cin >> n;
	double num, are;
	for(int i = 1, idx, fa, ma, k; i<= n; ++ i) {
    
    
		cin >> idx >> fa >> ma;
		st.insert(idx);
		if(fa != -1) {
    
    
			Union(idx, fa);
			st.insert(fa);
		}
		if(ma != -1) {
    
    
			Union(idx, ma);
			st.insert(ma);
		}
		cin >> k;
		for(int j = 0, x; j < k; ++ j) {
    
    
			cin >> x;
			Union(idx, x);
			st.insert(x);
		}
		cin >> num >> are;
		int pp = Find(idx);
		house[pp] += num;
		area[pp] += are; 
	}
	for(int i = 0; i < 10000; ++ i) {
    
    
		if(pa[i] == i && st.count(i)) {
    
    
			ans.push_back({
    
    mn[i], peo[i], house[i], area[i]});
		}
	}
	sort(ans.begin(), ans.end());
	int siz = ans.size();
	cout << siz << endl;
	for(int i = 0; i < siz; ++ i) {
    
    
		printf("%04d %d %.3f %.3f\n", ans[i].mn, ans[i].peo, 
			ans[i].house / (double)ans[i].peo, ans[i].area / (double)ans[i].peo);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39602052/article/details/114642092