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 }
  • 相关阅读:
    【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)
    android studio 编程中用到的快捷键
    java时间格式串
    android Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
    linux安装vmware
    x1c 2017 安装mint18的坑——grub2
    x1c2017 8G版 win linux的取舍纠结记录
    python的try finally (还真不简单)
    kafka+docker+python
    json文件不能有注释
  • 原文地址:https://www.cnblogs.com/barrier/p/5545902.html
Copyright © 2011-2022 走看看