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\n",k); 103 sort(r,r+k,compare); 104 for(int i=0;i<k;++i) 105 printf("%04d %d %.3lf %.3lf\n",r[i].num,r[i].people,r[i].rh,r[i].ra); 106 return 0; 107 }