版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccDLlyy/article/details/79809591
题目链接:点击打开链接
思路:并查集
#include <bits/stdc++.h>
using namespace std;
int fa[10000],house[10000],area[10000],book[10000];
struct node{
int minNum,cnt;
double averHour,averArea;
node(int a,int b,double c,double d):minNum(a),cnt(b),averHour(c),averArea(d){}
bool operator<(const node &b)const{
if(fabs(averArea - b.averArea) > 1e-7){
return averArea > b.averArea;
}
else{
return minNum < b.minNum;
}
}
};
int father(int x){
return fa[x] = (x == fa[x]?x:father(fa[x]));
}
void merge(int a,int b){
int x = father(a);
int y = father(b);
if(x != y){
fa[x] = y;
}
return;
}
set<int> s;
map<int,int> m1,m2,m3,m4;
vector<node> v;
int main(){
int n;
int id,f,m,k,son;
for(int i = 0;i < 10000;i++){
fa[i] = i;
house[i] = 0;
area[i] = 0;
book[i] = 0;
}
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d%d%d",&id,&f,&m);
book[id] = 1;
if(f != -1){
merge(id,f);
book[f] = 1;
}
if(m != -1){
merge(id,m);
book[m] = 1;
}
scanf("%d",&k);
for(int j = 0;j < k;j++){
scanf("%d",&son);
merge(id,son);
book[son] = 1;
}
scanf("%d%d",&house[id],&area[id]);
}
for(int i = 0;i < 10000;i++){
if(book[i] == 0) continue;
int x = father(i);
s.insert(x);
if(m1.find(x) == m1.end() || m1[x] > i){
m1[x] = i;
}
m2[x]++;
m3[x] += house[i];
m4[x] += area[i];
}
for(set<int>::iterator it = s.begin();it != s.end();it++){
v.push_back(node(m1[*it],m2[*it],(double)m3[*it] / m2[*it],(double)m4[*it] / m2[*it]));
}
sort(v.begin(),v.end());
printf("%d\n",v.size());
for(int i = 0;i < v.size();i++){
printf("%04d %d %.3f %.3f\n",v[i].minNum,v[i].cnt,v[i].averHour,v[i].averArea);
}
return 0;
}