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 }
永远热爱,永远向着光。

浙公网安备 33010602011771号