树的遍历 | 1079 理解题意+DFS
这题如果读懂了题意,就很好做,一波操作就结束了。不过题目有点难读,考验耐心和读题的细致。
AC代码:
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 100010 #define MAX (1<<30)-1 #define V vector<int> using namespace std; typedef struct Node{ int id,cnt=0; // bool isR=0; //isRetail vector<int> l; //leaves }Node; Node nd[LEN]; double ans=0; double p,r; double rate; void dfs(int s,int d){ if(nd[s].cnt){ ans+=pow(rate,d)*p*nd[s].cnt; return; } int i; FF(i,nd[s].l.size()){ dfs(nd[s].l[i],d+1); } } int main(){ // freopen("1079.txt","r",stdin); int n,k,i,t; I("%d%lf%lf",&n,&p,&r); rate=1+r/100; FF(i,n){ I("%d",&k); if(k) while(k--){ I("%d",&t); nd[i].l.push_back(t); }else{ I("%d",&t); nd[i].cnt=t; // nd[i].isR=1; } } dfs(0,0); O("%.1f",ans); return 0; }