做题记录 pat1114

1114 Family Property - PAT (Advanced Level) Practice (pintia.cn)

#include "bits/stdc++.h"

using namespace std;
/*
 * 一直出错的原因
 * id为4位数,我忽略了0000
 */
struct Node{
    int sets;
    int area;
    int id;
}inf[1010];

struct Ans{
    int id;
    int cnt;
    double sets;
    double area;

    void out(){
        cout<<setw(4)<<setfill('0')<<id<<" ";
        cout<<cnt<<" ";
        cout << fixed << setprecision(3)<<sets<< " ";
        cout<<fixed <<setprecision(3)<<area<<"\n";
    }
};

int p[10010];

bool st[10010];

int find(int x){
    if(p[x] != x)p[x]=find(p[x]);
    return p[x];
}

void merge(int x,int y)
{
    int a= find(x),b= find(y);
    if(a!=b){
        a<b?p[b]=a:p[a]=b;
    }
}

int main()
{
    for(int i=0;i<10000;i++)p[i]=i;
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int k;
        int idx,fax,mox,chx;
        cin>>idx>>fax>>mox;
        inf[i].id=idx;
        st[idx]=true;
        if(mox!=-1){
            merge(mox,idx);
            st[mox]=true;
        }
        if(fax!=-1) {
            merge(fax,idx);
            st[fax]=true;
        }
        cin>>k;
        while(k--){
            cin>>chx;
            st[chx]=true;
            merge(idx,chx);
        }
        cin>>inf[i].sets>>inf[i].area;
    }

    map<int,Ans> mp;
    for(int i=0;i<n;i++){
        int t=find(inf[i].id);
        mp[t].sets += inf[i].sets;
        mp[t].area += inf[i].area;
    }
    for(int i=0;i<10000;i++){
        if(st[i]){
            int t=find(i);
            mp[t].cnt++;
        }
    }

    vector<Ans> ans;
    for(auto [a,b]:mp){
        b.id=a;
        b.sets/=b.cnt;
        b.area/=b.cnt;
        ans.push_back(b);
    }
    sort(ans.begin(),ans.end(),[](const Ans& a,const Ans& b){
        if(a.area != b.area)return a.area>  b.area;
        return a.id<b.id;
    });
    cout<<ans.size()<<"\n";
    for(int i=0;i<ans.size();i++){
        ans[i].out();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值