zoukankan      html  css  js  c++  java
  • L2-007. 家庭房产

    L2-007. 家庭房产

    题目链接:https://www.patest.cn/contests/gplt/L2-007

    并查集

    初学,看这题的时候完全没有什么好的想法,参考了@yinzm的blog用BFS做了一遍,错了三个测试点,找了一下午没找出来,另寻他法。看到了并查集这个概念,做了一两题稍微掌握了一下,尝试做这题。

    代码如下:

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<algorithm>
      4 #include<cmath>
      5 #define EPS 1e-8
      6 #define N 10000
      7 using namespace std;
      8 struct node{
      9     int house,area;
     10 };
     11 struct res{
     12     int num;
     13     int people;
     14     int house;
     15     int area;
     16     double rh,ra;
     17 };
     18 res r[1000];
     19 int k;
     20 node a[N];
     21 int pre[N];
     22 bool mark[N];
     23 void Make(){
     24     for(int i=0;i<N;++i)pre[i]=i;
     25 }
     26 int Find(int x){
     27     if(x!=pre[x])
     28         pre[x]=Find(pre[x]);
     29     return pre[x];
     30 }
     31 void uion(int x,int y){
     32     int k1=Find(x),k2=Find(y);
     33     k1<k2?pre[k2]=k1:pre[k1]=k2;
     34 }
     35 bool compare(res x,res y){
     36     if(fabs(x.ra-y.ra)<EPS)return x.num<y.num;
     37     else return x.ra>y.ra;
     38 }
     39 int main(void){
     40     freopen("in.txt","r",stdin);
     41     int n;
     42     scanf("%d",&n);
     43     Make();
     44     for(int i=0;i<n;++i){
     45         int me,father,mother,num,kid[5],house,area;
     46         scanf("%d%d%d%d",&me,&father,&mother,&num);
     47         mark[me]=1;
     48         if(father!=-1){
     49             uion(me,father);
     50             mark[father]=1;
     51         }
     52         if(mother!=-1){
     53             uion(me,mother);
     54             mark[mother]=1;
     55         }
     56         for(int i=0;i<num;++i){
     57             scanf("%d",&kid[i]);
     58             mark[kid[i]]=1;
     59             uion(me,kid[i]);
     60         }
     61         scanf("%d%d",&house,&area);
     62         a[me].house=house;
     63         a[me].area=area;
     64     }
     65     for(int i=0;i<N;++i)
     66         Find(i);
     67     int p;
     68     for(int i=0;i<N;++i){
     69         if(mark[i]){
     70             if(k==0){
     71                 r[k].num=pre[i];
     72                 r[k].people++;
     73                 r[k].house=a[i].house;
     74                 r[k].area=a[i].area;
     75                 k++;
     76             }else{
     77                 bool flag=true;
     78                 for(p=0;p<k;++p){
     79                     if(r[p].num==pre[i]){
     80                         flag=false;
     81                         break;
     82                     }
     83                 }
     84                 if(flag){
     85                     r[k].num=pre[i];
     86                     r[k].people++;
     87                     r[k].house=a[i].house;
     88                     r[k].area=a[i].area;
     89                     k++;
     90                 }else{
     91                     r[p].people++;
     92                     r[p].house+=a[i].house;
     93                     r[p].area+=a[i].area;
     94                 }
     95             }
     96         }
     97     }
     98     for(int i=0;i<k;++i){
     99         r[i].rh=r[i].house*1.0/r[i].people;
    100         r[i].ra=r[i].area*1.0/r[i].people;
    101     }
    102     printf("%d
    ",k);
    103     sort(r,r+k,compare);
    104     for(int i=0;i<k;++i)
    105         printf("%04d %d %.3lf %.3lf
    ",r[i].num,r[i].people,r[i].rh,r[i].ra);
    106     return 0;
    107 }
  • 相关阅读:
    UPC2018组队训练赛第十二场
    ACM-ICPC 2018南京赛区网络预选赛
    UPC2018组队训练赛第十一场
    UPC2018组队训练赛第十场
    UPC2018组队训练赛第九场
    linux 用简单密码
    设置分辨率
    packstack
    rbenv
    elasticsearch
  • 原文地址:https://www.cnblogs.com/barrier/p/5545902.html
Copyright © 2011-2022 走看看