天梯赛 L2 家庭房产

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}







猜你喜欢

转载自blog.csdn.net/ccDLlyy/article/details/79809591