L2-007 家庭房产
#includebits/stdc.h using namespace std; const int N9999; int S[N]; // S[i]1编号为i的人是否存在 int s[N10]; //并查集查询编号为i的人家族中编号最小的人的编号 using family arrayint, 4; //编号、人数、总房产套数、总房产面积 using people arrayint, 3; //编号、房产套数、房产面积 family f[N10]; people p[N10]; int find(int x){// 查 return s[x]x?x:s[x]find(s[x]); } void merge(int i, int j){// 并 ifind(i), jfind(j); if(ij) swap(i, j); s[i]j; } signed main(){ //初始化 for(int i0;iN;i) s[i]i, f[i][0]i; int n; cinn; for(int i1;in;i) { int id,father,mother,k; cinidfathermotherk; if(father!-1) merge(id, father); if(mother!-1) merge(id, mother); S[id]S[father]S[mother]1; for(int j1;jk;j){ int x; cinx; S[x]1; merge(x, id); } int cnt, area; cincntarea; p[i]{id, cnt, area}; } vectorintindx; //所有家庭中成员最小编号索引 // 统计人数 for(int i0;iN;i) { if(!S[i]) continue; int target find(i); f[target][1]; if(itarget) indx.push_back(i); } // 统计房产 for(int i1;in;i) { auto [id, cnt, area] p[i]; int target find(id); f[target][2]cnt; f[target][3]area; } vectorfamilyans; for(auto it : indx) ans.push_back(f[it]); // 排序 sort(ans.begin(), ans.end(), [](family x, family y){ double avgx (double)x[3]/x[1], avgy (double)y[3]/y[1]; if(avgx!avgy) return avgxavgy; // 先按人均面积降序 return x[0]y[0]; // 再按成员编号的升序 }); coutans.size(); for(auto [id, nums, cnt, area]:ans){ coutendl; coutsetfill(0)setw(4)id nums ; coutfixedsetprecision(3)(double)cnt/nums ; coutfixedsetprecision(3)(double)area/nums; } }考点:并查集、模拟、排序注意1.“编号是每个人独有的一个4位数的编号”需要注意家庭成员的输出格式coutsetfill(0)setw(4)id nums ;2.“人均值要求保留小数点后3位”coutfixedsetprecision(3)(double)cnt/nums ; coutfixedsetprecision(3)(double)area/nums;3.父母编号可能为-1记得处理4.并查集数组别忘了初始化26/4/4