天梯赛 L2-020 功夫传人

模拟加bfs

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef long long ll;
const int N = 3e5 + 10;
const int mod = 998244353;
void solve() {
	int n;
	double z,r;
	cin>>n>>z>>r;
	vector<vector<int>>g(n+1);
	vector<double> vt(n+1,0),st(n+1,0);	//标记是否得道
	for(int i = 0; i < n ; i++){
		int k;
		cin>>k;
		if(k == 0){
			double tmp;
			cin>>tmp;
			vt[i] = tmp;
			continue;
		}
		for(int j = 0 ; j < k ; j++){
			int x;
			cin>>x;
			st[x] = 1;
			g[i].push_back(x);
		}
	}
	int str = 0;
	for(int i = 0 ; i < n ; i++){
		if(st[i] == 0){
			str = i;
		}
	}
	queue<pair<int,double>> q;
	double sum = 0;
	if(vt[str] != 0){
		sum += z * 1.0 * vt[str];
		q.push({str,z * 1.0 * vt[str]});
	}else{
		q.push({str,z});
	}
	while(!q.empty()){
		int x = q.front().first;
		double val = q.front().second;
		q.pop();
		// cout<<x<<" "<<val*(1-r*1.0/100)<<endl;
		for(auto it : g[x]){
			if(vt[it] == 0){
				q.push({it,val*(1-r*1.0/100)});
			}else{
				sum += val*1.0*(1-r*1.0/100) * vt[it];
				q.push({it,val*1.0*(1-r*1.0/100) * vt[it]});
			}
		}
	}
	cout<<(int)sum<<endl;
}
signed main() {
    // ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int tt = 1;
    //    cin >> tt;
    while (tt--) {
        solve();
    }
    return 0;
}

### 团体程序设计天梯赛 L2 练习题 #### 题目一:小字辈 这道题目要求处理家族成员的信息,具体是从给定的数据集中找出辈分最低的一群人,并按照特定顺序输出这些人的名字。此问题主要考察数据结构的选择以及字符串操作能力[^1]。 对于这个问题的一个解决方案可以采用如下Python代码实现: ```python def find_youngest_generations(family_tree): generation_dict = {} for line in family_tree.split('\n'): name, gen = line.strip().split() if int(gen) not in generation_dict or (int(gen) in generation_dict and len(generation_dict[int(gen)]) < 1): generation_dict[int(gen)] = [] generation_dict[int(gen)].append(name) min_gen = min(generation_dict.keys()) result_names = sorted(generation_dict[min_gen]) return ' '.join(result_names) ``` #### 题目二:功夫传人 该题目描述了一个关于武术传承的问题场景,在这里需要通过并查集来追踪每位武者的师承关系及其所继承的内力强度变化情况。特别之处在于当遇到所谓的“飞升者”时,其后代获得的初始内力会有所不同[^2]。 解决此类问题的一种方法是利用两个列表分别记录每个人的当前内力值和他们是否为飞升者的标志位。每当遇见新的弟子加入某个门派时,则更新相应的属性;而查询某个人物最终能掌握多少内力则需沿着树状结构向上追溯直到根节点为止。 #### 题目三:集合相似度计算 本题旨在评估参赛选手对基本算法的理解程度,特别是如何高效地求解两个有限集合之间的交集与并集运算。为了得到正确的答案,应当先去除重复项再做进一步分析[^3]。 下面给出一段用于完成上述功能的C++代码片段作为参考: ```cpp #include <iostream> #include <set> using namespace std; double calculate_similarity(set<int>& setA, set<int>& setB){ set<int> intersection; set_intersection(setA.begin(), setA.end(), setB.begin(), setB.end(), inserter(intersection, intersection.begin())); double Nc = intersection.size(); double Nt = setA.size() + setB.size() - Nc; // |A∪B| = |A|+|B|-|A∩B| return (Nc / Nt * 100); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值