版本4
写了一个bug,查明后发现是变量重复。以后命名变量的时候还是尽可能起到唯一性。不然就很难找到bug的所在。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int N = 1e5+5;
vector<int> G[N];
int n, cnt = 0;
double p, r, resp = 0, e = 0.00001;
//变量重复 根节点形参设为了r 增长的利润也是r
void dfs(int rt, double temp){
if(G[rt].size() == 0){
if(abs(resp - temp) < e) cnt++;
else if(temp > resp) {
resp = temp;
cnt = 1;
}
return;
}
double t = temp*(1 + r/100.0);
for(int i = 0; i < G[rt].size(); i++){
dfs(G[rt][i], t);
}
}
int main(){
scanf("%d %lf %lf", &n, &p, &r);
int root, x;
for(int i = 0; i < n; i++){
scanf("%d", &x);
if(x == -1) root = i;
else G[x].push_back(i);
}
dfs(root, p);
printf("%.2f %d", resp, cnt);
return 0;
}
版本3
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int N = 1e5+5;
vector<int> G[N];
int n, cnt = 0, deep = 0;
double p, r;
void dfs(int r, int d){
if(G[r].size() == 0){
if(deep == d) cnt++;
else if(d > deep) {
deep = d;
cnt = 1;
}
return;
}
for(int i = 0; i < G[r].size(); i++){
dfs(G[r][i], d + 1);
}
}
int main(){
scanf("%d %lf %lf", &n, &p, &r);
int root, x;
for(int i = 0; i < n; i++){
scanf("%d", &x);
if(x == -1) root = i;
else G[x].push_back(i);
}
dfs(root, 0);
printf("%.2f %d", p*pow(1+r/100.0, deep), cnt);
return 0;
}
版本2
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
vector<int> v[maxn],u;
int maxN=0;
double t=0;
void dfs(int r,double p, double c){
if(v[r].size()==0 ){
if(p > t){
t = p;
maxN=0;
}
if(p==t) maxN++;
return;
}
p = p * (1 + c/100.0);
for(int i=0;i<v[r].size();i++){
int j = v[r][i];
dfs(j,p,c);
}
}
int main(){
int n,k,num,tmp,root;
double price,inc;
cin>>n>>price>>inc;
for(int i=0;i<n;i++){
cin>>tmp;
if(tmp==-1){ //根
root=i;
}else{
v[tmp].push_back(i);
}
}
dfs(root,price,inc);
printf("%.2f %d\n",t,maxN);
return 0;
}
版本1
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
vector<int> v[maxn],u;
int maxN=0,maxDepth=0;
void dfs(int r, int depth){
if(v[r].size()==0 ){
if(depth > maxDepth){
maxDepth=depth;
maxN=1;
}
else if(maxDepth==depth) maxN++;
return;
}
for(int i=0;i<v[r].size();i++){
int j = v[r][i];
dfs(j, depth+1);
}
}
int main(){
int n,tmp,root;
double price,inc;
cin>>n>>price>>inc;
for(int i=0;i<n;i++){
cin>>tmp;
if(tmp==-1){ //根
root=i;
}else{
v[tmp].push_back(i);
}
}
dfs(root, 0);
printf("%.2f %d\n",price*pow(1+inc/100, maxDepth),maxN);
return 0;
}