[PAT][GPLT][CCCC]L2-020. 功夫传人

题目链接:https://www.patest.cn/contests/gplt/L2-010

开此贴是想记录一个坑,这题用过float会精度丢失!不信的话把我的代码的double改成float就发现AC不了了,看来习惯还没养好,以后能用double绝不用float了

然后百度搜了搜几篇题解都没提到这个问题,可能大家都是默认只用double了的吧,只有我这样跳坑了,然后思路部分有一篇我觉得挺好了的,就不再写了,大家参考 https://blog.csdn.net/hsst1105/article/details/68063300 这篇吧,这篇的思路甚至代码结构都跟我差不多,不过我写我的之前绝对没搜过题解,不过也是,这题算比较水的了,也没多少种写法和算法

还是附上AC代码

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int gen[100005]={0},vis[100005]={0};
vector<int> v[100005];
int n;
double ans=0.0,z,r;
void dfs(int x,double nowz)
{
	vis[x]=1;
	if(gen[x]!=0)
	{
		ans+=nowz*gen[x];
		return;
	}
	for(int i=0;i<v[x].size();i++)
	{
		if(!vis[v[x][i]])
			dfs(v[x][i],nowz*r);
	}
}
int main()
{
	scanf("%d %lf %lf",&n,&z,&r);
	r=(100.0-r)*0.01;
	for(int i=0;i<n;i++)
	{
		int k;
		scanf("%d",&k);
		if(k==0)
			scanf("%d",&gen[i]);
		for(int j=0;j<k;j++)
		{
			int tmp;
			scanf("%d",&tmp);
			v[i].push_back(tmp);
		}
	}
	for(int i=0;i<n;i++)
	{
		if(!vis[i])
		{
			dfs(i,z);
		}
	}
	printf("%d",(int)ans);
	return 0;
}

点赞