PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
來源:acwing
分析:
需要注意的點(diǎn):
補(bǔ)充:printf("%4d",id)表示輸出寬度為4,且右對(duì)齊,不足的在前面補(bǔ)空格。當(dāng)變量的實(shí)際寬度大于4時(shí),輸出變量的所有數(shù)字.
ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 10010; //邊的數(shù)量 int n; int p[N]; //并查集父親數(shù)組 int c[N];//c[i]表示i這家人的人數(shù) count int hc[N];//房子數(shù)量 house count int ha[N]; //房子面積 house area bool st[N];// 戶主 和父母,子女分別建邊 struct Edge{int a, b; }e[N];// 一家人放在一個(gè)結(jié)構(gòu)體中,排序使用 struct Family{int id ,c ,hc, ha;bool operator<(const Family & t)const{// ha /c , t.ha/t.cif( ha * t.c != c * t.ha) return ha * t.c > c* t.ha;return id < t.id;} };//并查集找根 int find(int x){if(p[x]!= x) p[x] = find(p[x]);return p[x]; }int main(){cin >>n;int m =0; //表示邊數(shù)//第一部分: 讀入所有輸入,并建邊for(int i = 0; i < n; i++){int id , father ,mother, k;cin >> id >> father >> mother >>k;//標(biāo)記id出現(xiàn)過st[id] = true;if(father != -1) e[m++] = {id,father};if(mother != -1) e[m++] = {id,mother};for(int j = 0 ;j< k; j++){int son;cin >> son;e[m++] ={id,son};}cin >> hc[id] >> ha[id]; //房子數(shù)量,房子面積}//第二部分:得到每個(gè)家庭,并且戶主編號(hào)最小//并查集初始化for(int i = 0; i<= N; i++) p[i] = i,c[i] =1 ;//i這家人只有1個(gè)人//遍歷每條邊:合并集合:得到每個(gè)家庭。for(int i = 0 ; i<m ;i++){int a = e[i].a, b = e[i].b;st[a] = st[b] = true; //標(biāo)記每個(gè)點(diǎn)出現(xiàn)過//一個(gè)集合的根結(jié)點(diǎn)int pa = find(a),pb = find(b);//合并集合,讓根結(jié)點(diǎn)大的集合掛到 根結(jié)點(diǎn)小的集合上!!//這樣根結(jié)點(diǎn)就是編號(hào)最小的那個(gè)!!!//題目要求:ID 是家庭成員中編號(hào)最小的成員編號(hào)if(pa != pb){if(pb > pa) swap(pa,pb); //讓pb成為較小的// 那么pb那個(gè)集合的值都要更新:加上pa集合的值//人數(shù) , 房子數(shù)量,房子面積c[pb] += c[pa],hc[pb]+= hc[pa],ha[pb] += ha[pa];//pa集合掛到編號(hào)更小pb集合p[pa] = pb; }}// 第三部分:每個(gè)家庭的信息存起來,并輸出vector<Family> familys;//遍歷所有的點(diǎn),如果之前出現(xiàn)過st[i] == true 并且是集合的根結(jié)點(diǎn)p[i] == i//代表i就是一家之主,將該家庭統(tǒng)計(jì)到vector中for(int i =0 ;i < N; i++){if(st[i] && p[i] == i)familys.push_back({i,c[i],hc[i],ha[i]});}//排序輸出sort(familys.begin(),familys.end());cout<< familys.size()<<endl;for( auto f :familys){printf("%04d %d %.3lf %.3lf\n",f.id, f.c,(double)f.hc/f.c,(double)f.ha/f.c);} }注意:測試點(diǎn)3、4、5包括0000這個(gè)人。第一遍忽略了這個(gè)人,導(dǎo)致三個(gè)測試點(diǎn)錯(cuò)誤。
題目鏈接
PAT甲級(jí)1114 Family Property
https://www.acwing.com/problem/content/1606/
總結(jié)
以上是生活随笔為你收集整理的PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1013 Battle Ove
- 下一篇: PAT甲级1118 Birds in F