L2-007. 家庭房產c++版本答案
給定每個人的家庭成員和其自己名下的房產,請你統計出每個家庭的人口數、人均房產面積及房產套數。
輸入格式:
輸入第一行給出一個正整數N(<=1000),隨後N行,每行按下列格式給出一個人的房產:
編號 父 母 k 孩子1 ... 孩子k 房產套數 總面積
其中 編號 是每個人獨有的一個4位數的編號;父 和 母 分別是該編號對應的這個人的父母的編號(如果已經過世,則顯示-1);k(0<=k<=5)是該人的子女的個數;孩子i是其子女的編號。
輸出格式:
首先在第一行輸出家庭個數(所有有親屬關系的人都屬於同一個家庭)。隨後按下列格式輸出每個家庭的信息:
家庭成員的最小編號 家庭人口數 人均房產套數 人均房產面積
其中人均值要求保留小數點後3位。家庭信息首先按人均面積降序輸出,若有並列,則按成員編號的升序輸出。
輸入樣例:
10 6666 5551 5552 1 7777 1 100 1234 5678 9012 1 0002 2 300 8888 -1 -1 0 1 1000 2468 0001 0004 1 2222 1 500 7777 6666 -1 0 2 300 3721 -1 -1 1 2333 2 150 9012 -1 -1 3 1236 1235 1234 1 100 1235 5678 9012 0 1 50 2222 1236 2468 2 6661 6662 1 300 2333 -1 3721 3 6661 6662 6663 1 100
輸出樣例:
3 8888 1 1.000 1000.000 0001 15 0.600 100.000 5551 4 0.750 100.000
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;
struct qq
{
vector<int> family;
int num;
int area;
bool flag;
qq()
{
num=0;
area=0;
flag=0;
}
};
struct ww
{
int id;
int area;
int hn;
int num;
};
bool gg(ww a,ww b)
{
double q=(double)a.area/(double)a.hn;
double w=(double)b.area/(double)b.hn;
if(q>w)return true;
else if(q<w)return false;
return a.id<b.id;
}
class zz
{
private:
qq a[10000];
ww b[10000];
vector<int> c;
public:
zz()
{
int n,i;
cin>>n;
while(n--)
{
int q,k;
cin>>q;
a[q].flag=false;
c.push_back(q);
for(i=0;i<2;i++)
{
cin>>k;
a[q].family.push_back(k);
if(k!=-1)a[k].family.push_back(q);
}
cin>>k;
int e;
while(k--)
{
cin>>e;
a[q].family.push_back(e);
if(e!=-1)a[e].family.push_back(q);
}
cin>>a[q].num>>a[q].area;
}
}
void dfs(int q,int j)
{
if(a[q].flag==true)return;
a[q].flag=true;
if(q==-1)return;
b[j].hn++;
int i;
if(b[j].id>q)b[j].id=q;
b[j].num+=a[q].num;
b[j].area+=a[q].area;
for(i=0;i<a[q].family.size();i++)
{
if(a[q].family[i]!=-1)
{
dfs(a[q].family[i],j);
}
}
}
void dfs1()
{
for(int i=0;i<c.size();i++)
{
b[i].num=0;
b[i].area=0;
b[i].hn=0;
b[i].id=10000;
dfs(c[i],i);
}
}
void dis()
{
sort(b,b+c.size(),gg);
int sum=0;
for(int j=0;j<c.size();j++)
{
if(b[j].hn!=0)sum++;
else break;
}
cout<<sum<<endl;
for(int i=0;i<sum;i++)
{
if(b[i].hn!=0)
{
int k=b[i].hn;
int w=b[i].id;
if(w<10)cout<<"000"<<w;
else if(w<100)cout<<"00"<<w;
else if(w<1000)cout<<"0"<<w;
else cout<<w;
cout<<" "<<k<<" "<<fixed<<setprecision(3)<<(double)b[i].num/(double)k<<" "<<(double)b[i].area/(double)k<<endl;
}
}
}
};
int main()
{
zz zx;
zx.dfs1();
zx.dis();
return 0;
}
L2-007. 家庭房產c++版本答案