题目链接: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;
}