PTA L2-007家庭房产

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872

解体思路:利用并查集将所有家庭成员连接到一个祖宗,连接的时候优先选择将编号大的连接到编号小的,让编号小的当祖宗。

ac代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<map>
  6 #include<queue>
  7 #include<set>
  8 #include<cmath>
  9 #include<list>
 10 #include<cstring>
 11 #include<string>
 12 #define ll long long
 13 #define ull unsigned long long
 14 #define inf 0x3f3f3f3f
 15 #define inff 0x7fffffff
 16 using namespace std;
 17 const int N = 10000 + 10;
 18 const int M = 200000 + 10;
 19 const ll mod = 1e9 + 7;
 20 
 21 struct pep {
 22     int num = 0, area = 0;
 23     int sum_p = 1;
 24 }p[N];
 25 
 26 int fa[N], vis[N];
 27 int ans[N];
 28 
 29 int finds(int x) {
 30     if (fa[x] == x) return x;
 31     else return fa[x] = finds(fa[x]);
 32 }
 33 
 34 bool cmp(int a, int b) {
 35     double a1 = (double)(p[a].area * 1.0 / p[a].sum_p * 1.0);
 36     double b1 = (double)(p[b].area * 1.0 / p[b].sum_p * 1.0);
 37     if (fa[a] == a && fa[b] == b) {
 38         if (a1 > b1) return true;
 39         else if (a1 < b1) return false;
 40         else {
 41             if (a < b) return true;
 42             else return false;
 43         }
 44     }
 45     else if (fa[a] == a) return true;
 46     else return false;
 47 }
 48 
 49 int main() {
 50 
 51     int n;
 52     cin >> n;
 53     for (int i = 1; i <= 10005; i++) {
 54         fa[i] = i;
 55     }
 56     for (int i = 1; i <= n; i++) {
 57         int x;
 58         cin >> x;
 59         vis[x] = 1;
 60         int fat, mot;
 61         cin >> fat >> mot;
 62         //vis[fat] = vis[mot] = 1;
 63         int k;
 64         cin >> k;
 65         for (int i = 1; i <= k; i++) {
 66             int num;
 67             cin >> num;
 68             vis[num] = 1;
 69             int t1 = finds(x);
 70             int t2 = finds(num);
 71             if (t1 < t2) {
 72                 fa[t2] = t1;
 73                 p[t1].num += p[t2].num;
 74                 p[t1].area += p[t2].area;
 75                 p[t1].sum_p += p[t2].sum_p;
 76             }
 77             else if (t1 > t2) {
 78                 fa[t1] = t2;
 79                 p[t2].num += p[t1].num;
 80                 p[t2].area += p[t1].area;
 81                 p[t2].sum_p += p[t1].sum_p;
 82             }
 83         }
 84         if (fat != -1) {
 85             vis[fat] = 1;
 86             int t1 = finds(x);
 87             int t2 = finds(fat);
 88             if (t1 < t2) {
 89                 fa[t2] = t1;
 90                 p[t1].num += p[t2].num;
 91                 p[t1].area += p[t2].area;
 92                 p[t1].sum_p += p[t2].sum_p;
 93             }
 94             else if(t1 > t2) {
 95                 fa[t1] = t2;
 96                 p[t2].num += p[t1].num;
 97                 p[t2].area += p[t1].area;
 98                 p[t2].sum_p += p[t1].sum_p;
 99             }
100         }
101         if (mot != -1) {
102             vis[mot] = 1;
103             int t1 = finds(x);
104             int t2 = finds(mot);
105             if (t1 < t2) {
106                 fa[t2] = t1;
107                 p[t1].num += p[t2].num;
108                 p[t1].area += p[t2].area;
109                 p[t1].sum_p += p[t2].sum_p;
110             }
111             else if(t1 > t2) {
112                 fa[t1] = t2;
113                 p[t2].num += p[t1].num;
114                 p[t2].area += p[t1].area;
115                 p[t2].sum_p += p[t1].sum_p;
116             }
117         }
118         int pos_house, pos_area;
119         cin >> pos_house >> pos_area;
120         int t = finds(x);
121         p[t].num += pos_house;
122         p[t].area += pos_area;
123     }
124     int p_sum = 0;
125     for (int i = 0; i <= 10005; i++) {
126         ans[i] = i;
127         //if (fa[i] != i) p[fa[i]].sum_p++;
128         if (fa[i] == i && vis[i]) {
129             p_sum++;
130             //cout << i << " " << p[i].sum_p << "\n";
131         }
132     }
133     /*for (int i = 1; i <= 10000; i++) {
134         if (fa[i] == i && vis[i]) {
135             cout << i << " " << p[i].sum_p << "\n";
136         }
137     }*/
138     /*for (int i = 1; i <= 1000; i++) {
139         cout << fa[i] << "\n";
140     }*/
141     sort(ans, ans + 10001, cmp);
142     cout << p_sum << "\n";
143     for (int i = 0; i < p_sum; i++) {
144         int px = ans[i];
145         double aver1 = (double)(p[px].num * 1.0 / p[px].sum_p * 1.0);
146         double aver2 = (double)(p[px].area * 1.0 / p[px].sum_p * 1.0);
147         printf("%04d %d %.3lf %.3lf\n", px, p[px].sum_p, aver1, aver2);
148     }
149 
150     return 0;
151 }

 

 
 
posted @ 2022-04-19 15:32  Keyzee  阅读(64)  评论(0)    收藏  举报