zoukankan      html  css  js  c++  java
  • 团体程序设计天梯赛 L2-007 家庭房产 (25分)

    题目链接:

    L2-007 家庭房产 (25分)

    思路:

    对于每个人,将和自己有关系的人都保存下来,将每个人的房产保存下来,然后对所有人dfs即可;

    代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int maxn = 12345;
    vector<int> G[maxn];
    int n, vst[maxn], a[maxn], cnt[maxn], s[maxn];
    int no, ans, tcnt, ts;
    void dfs(int u) {           //cerr << u << '
    ';
    	++ans;
    	no = min(no, u);
    	vst[u] = true;
    	tcnt += cnt[u];
    	ts += s[u];
    	for(int & x : G[u]) {
    		if(vst[x] == false) dfs(x);
    	}
    }
    struct fam {
    	int no,	ans;
    	double cnt, s;
    	bool operator < (const fam & x) const {
    		return s == x.s ? no < x.no : s > x.s;
    	}
    };
    int main() {
    #ifdef MyTest
    	freopen("Sakura.txt", "r", stdin);
    #endif	
    	scanf("%d", &n);
    	for(int i = 0; i < n; i++) {
    		scanf("%d", a + i);
    		vector<int> v(2);
    		int k, x;
    		scanf("%d %d %d", &v[0], &v[1], &k);
    		while(k--) { scanf("%d", &x); v.push_back(x); }
    		for(int & x : v) { 
    		    if(~x)	G[x].push_back(a[i]), G[a[i]].push_back(x);
    		}
    		scanf("%d %d", cnt + a[i], s + a[i]);
    	}
    	vector<fam> v; 
    	for(int i = 0; i < n; i++) {
    		if(vst[a[i]] == false) {
    			no = a[i];
    			ans = tcnt = ts = 0;
    			dfs(no);              //cerr << "--------------
    ";
    			v.push_back(fam {no, ans, tcnt * 1.0 / ans, ts * 1.0 / ans});
    		}
    	}
    	sort(v.begin(), v.end());
    	printf("%d
    ", v.size());
    	for(fam & x : v) {
    		printf("%04d %d %.3f %.3f
    ", x.no, x.ans, x.cnt, x.s);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Code::blocks 使用c++ long double类型出错
    数论四大定理
    线性基
    win7 下强制删除文件
    C++数组指针的引用
    学习方法
    MySQL的ON DUPLICATE KEY UPDATE用法
    MVCC
    RabbitMQ中的Connection 和 Channel
    myisam和innodb的比较
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308666.html
Copyright © 2011-2022 走看看