L2-007. 家庭房产

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 10005;
int num[MAXN],area[MAXN];
vector<int> v[MAXN];
int exist[MAXN];
int vis[MAXN];
int Min ,cnt_f ,cnt_h ,total_a;

struct node{
	int Min;
	int cnt_f;
	double ph;
	double pa;
};
bool cmp(struct node a,struct node b){
	if(a.pa == b.pa){
		return a.Min < b.Min;
	}
	return a.pa > b.pa;
}
vector<node> ans;
void dfs(int node){
	for(int i = 0; i < v[node].size(); i++){
		if(!vis[v[node][i]]){
			vis[v[node][i]] = 1;
			Min = min(Min,v[node][i]);
			cnt_f += 1;
			cnt_h += num[v[node][i]];
			total_a += area[v[node][i]];
			dfs(v[node][i]);
		}
	}
}
int main(void){
	
	int n;
	cin >> n;
	for(int i = 0; i < n; i++){
		int id,cnt,fa,mo;
		cin >> id >> fa >> mo >> cnt;
		exist[id] = 1;
		if(fa != -1){
			v[id].push_back(fa);
			v[fa].push_back(id);
			exist[fa] = 1;
		}
		if(mo != -1){
			v[mo].push_back(id);
			v[id].push_back(mo);
			exist[mo] = 1;
		}
		for(int j = 0; j < cnt; j++){
			int ch;
			cin >> ch;
			v[id].push_back(ch);
			v[ch].push_back(id);
			exist[ch] = 1;
		}
		cin >> num[id] >> area[id];
	}
	for(int i = 0; i <= 9999; i++){
		if(exist[i] && !vis[i]){
			Min = i,cnt_f = 1,cnt_h = num[i],total_a = area[i];
			vis[i] = 1;
			dfs(i);
			struct node temp;
			temp.Min = Min;
			temp.cnt_f = cnt_f;
			temp.pa = total_a * 1.0 / cnt_f;
			temp.ph = cnt_h * 1.0 / cnt_f;
			ans.push_back(temp);
 		}
	}
	sort(ans.begin(),ans.end(),cmp);
	cout<<ans.size()<<endl;
	for(int i = 0; i < ans.size(); i++){
		printf("%04d %d %.3lf %.3lf\n",ans[i].Min,ans[i].cnt_f,ans[i].ph,ans[i].pa);
	}
	return 0;
}




猜你喜欢

转载自blog.csdn.net/gyh0730/article/details/80259891