衰减比例 r 可能是浮点数,所以输入的时候和写函数的时候要特别注意这一点。
自己逻辑上想到了完整的解法,但是在写qkmi函数的时候,传入的a一开始写成了int类型,将 100-r 转成了int导致精度丢失调了好长时间的bug。
代码如下
#include<bits/stdc++.h>
using namespace std;
const int N = 1E5 + 10;
int n;
double z,r;
int h[N],e[N],ne[N],idx;
int dis[N];
long long fl[N];
int st[N];
double pp[N];
void add(int a,int b){
e[idx] = b , ne[idx] = h[a] ,h[a] = idx ++ ;
}
void bfs(int x){
queue<int> q;
q.push(x);
while(q.size()){
int t = q.front();
q.pop();
for(int i=h[t];i!=-1;i=ne[i]){
// cout << "a b : "<< t << ' ' << e[i] << endl;
int j = e[i];
dis[j] = dis[t] + 1;
q.push(j);
}
}
}
double qkmi(double a,int b){
double res = 1 ;
double p = a / 100;
// cout <<"p: " << p << endl;
while(b){
if(b&1){
res = res * p;
}
p = p * p ;
b = b >> 1;
// cout << res << ' ' << p << ' ' << b << endl;
}
return res;
}
int main (){
cin >> n ;
cin >> z >> r ;
memset(h,-1,sizeof h);
for(int i=0;i<n;i++){
int k ;
cin >> k ;
if(!k){
long long up;
cin >> up;
fl[i] = up;
continue;
}
// cout << "seq:" << i << endl;
for(int j=1;j<=k;j++){
int b ;
cin >> b ;
// cout << b << ' ' ;
add(i,b);
}
}
bfs(0);
// for(int i=0;i<n;i++)
// cout << "dis:" << i << ' ' << dis[i] << endl;
//
pp[0] = 1.0;
double p = (100 -r) /100;
for(int i=1;i<=n;i++){
pp[i] = p * pp[i-1];
}
double ans = 0 ;
for(int i=0;i<n;i++){
if(fl[i]){
//cout << qkmi(100-r,dis[i]) ;
//cout << pp[dis[i]] << endl;
ans += qkmi(100-r,dis[i]) * z * fl[i] ;
//ans = ans + pp[dis[i]] * z * fl[i] ;
}
}
int res = ans ;
cout << res << endl;
//printf("%.0lf",ans) ;
return 0 ;
}